Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从jetpack compose中的惰性列中删除项目_Android_Kotlin_Android Jetpack_Android Jetpack Compose - Fatal编程技术网

Android 如何从jetpack compose中的惰性列中删除项目

Android 如何从jetpack compose中的惰性列中删除项目,android,kotlin,android-jetpack,android-jetpack-compose,Android,Kotlin,Android Jetpack,Android Jetpack Compose,我构建了一个lazy列,它从ViewModel获取数据,每次我添加一个项目时,lazy列都会重新组合,并且在lazy列中查看新项目,但是,当我添加删除项目的功能时,延迟列不会重新组合,删除的项目将保留在屏幕上,直到发生配置更改(如旋转屏幕) 我的问题是如何让惰性列知道列表在每次删除操作后都已更新。 以下是ViewModel: import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateL

我构建了一个lazy列,它从ViewModel获取数据,每次我添加一个项目时,lazy列都会重新组合,并且在lazy列中查看新项目,但是,当我添加删除项目的功能时,延迟列不会重新组合,删除的项目将保留在屏幕上,直到发生配置更改(如旋转屏幕)

我的问题是如何让惰性列知道列表在每次删除操作后都已更新。

以下是ViewModel:

import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import com.example.shoppinglistcompose.entities.Item

class AddNewShoppingListViewModel : ViewModel() {

val items = MutableLiveData<MutableList<Item>>(mutableListOf())

fun addNewItem(newItem: Item) {
    items.value = items.value?.plus(listOf(newItem)) as MutableList<Item>?
}

fun removeItem(item: Item) {
    items.value!!.remove(item)
    items.value = items.value?.plus(listOf()) as MutableList<Item>?
}
}
以下是它自身的组合乐趣:

@Composable
fun SingleItem(item: Item, deleteClick: () -> Unit) {
val composableScope = rememberCoroutineScope()
val new: MutableState<Boolean> = remember {
    mutableStateOf(true)
}
val color = remember { Animatable(Color(0xFFB9F6CA)) }
LaunchedEffect(new.value) {
    color.animateTo(if (new.value) Color(0xFFB9F6CA) else Color(0xFFE0F2F1))
}
Card(
    modifier = Modifier
        .padding(4.dp)
        .fillMaxWidth(),
    shape = RoundedCornerShape(8.dp),
    backgroundColor = color.value,
    elevation = 3.dp
) {
    composableScope.launch {
        delay(2000)
        new.value = false
    }
    Row(modifier = Modifier.fillMaxWidth() , horizontalArrangement = Arrangement.SpaceBetween) {
        Column(
            modifier = Modifier,
            horizontalAlignment = Alignment.Start,
            verticalArrangement = Arrangement.SpaceBetween
        ) {
            Text(text = item.name, style = MaterialTheme.typography.h5)
            Text(text = "${item.quantity}", style = MaterialTheme.typography.h6)
        }
        IconButton(onClick = deleteClick) {
            Icon(Icons.Rounded.Delete, "Button for deleting an Item of the items list.")
        }
    }

}

}
@Composable
趣味单件物品(物品:物品,删除点击:()->单位){
val composableScope=rememberCoroutineScope()
val new:MutableState=记住{
可变状态(true)
}
val color=记住{可设置动画(颜色(0xFFB9F6CA))}
LaunchDeffect(新的.value){
color.animateTo(如果(新的.value)颜色(0xFFB9F6CA)其他颜色(0xFF0F2F1))
}
卡片(
修饰语=修饰语
.填充(4.dp)
.fillMaxWidth(),
形状=圆形拐角形状(8.dp),
backgroundColor=color.value,
标高=3.dp
) {
复合镜发射{
延迟(2000年)
new.value=false
}
行(修饰符=修饰符.fillMaxWidth(),水平排列=排列.SpaceBetween){
纵队(
修饰符=修饰符,
水平对齐=对齐。开始,
垂直排列=排列。间距
) {
文本(Text=item.name,style=MaterialTheme.typography.h5)
Text(Text=“${item.quantity}”,style=MaterialTheme.typography.h6)
}
图标按钮(onClick=deleteClick){
图标(Icons.Rounded.Delete,“用于删除项目列表中项目的按钮”)
}
}
}
}

尝试更换线路

items.value!!.remove(item)
items.value = items.value?.plus(listOf()) as MutableList<Item>?
问题是表达式
items.value?.plus(listOf())
不会生成不同的实例,
ViewModel
不会重新发布该值,因为它与以前的值相比
=
。这是因为Kotlin只会在列表表达式的一个运算符与结果不相等时分配一个新列表


如果列表中有
,则使用上面的
过滤器
可确保生成新列表。

尝试替换该行

items.value!!.remove(item)
items.value = items.value?.plus(listOf()) as MutableList<Item>?
问题是表达式
items.value?.plus(listOf())
不会生成不同的实例,
ViewModel
不会重新发布该值,因为它与以前的值相比
=
。这是因为Kotlin只会在列表表达式的一个运算符与结果不相等时分配一个新列表


使用上面的
过滤器
可以确保如果列表中有
,则生成一个新列表。

贡献提示:对于下一个问题,尽量只包含足够的代码来重现问题或解释问题。上面的问题包含了大量与您遇到的问题无关的信息,这使得问题更难回答。贡献提示:对于您的下一个问题,请尝试只包含足够的代码来重现问题或解释问题。上面的问题包含了大量与您所遇到的问题无关的信息,这使得问题更难回答。
items.value = items.value?.filter { it != item }?.toMutableList()