首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从jetpack中的惰性列中删除项

如何从jetpack中的惰性列中删除项
EN

Stack Overflow用户
提问于 2021-04-21 19:41:43
回答 1查看 4.8K关注 0票数 6

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

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

下面是ViewModel:

代码语言:javascript
复制
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>?
}
}

,显示延迟列的Compsable:

代码语言:javascript
复制
content = { paddingValues ->
        Column(
            horizontalAlignment = Alignment.CenterHorizontally,
            modifier = Modifier
                .fillMaxSize()
                .padding(8.dp)
        ) {
            OutlinedTextField(
                value = text,
                onValueChange = { textFieldsViewModel.onShoppingListNameChanged(it) },
                label = { Text(text = "Shopping list Name") },
                modifier = Modifier
                    .fillMaxWidth()
                    .padding(start = 30.dp, end = 30.dp, bottom = 8.dp)
            )
            if (!items.value?.isEmpty()!!) {
                LazyColumn(
                    Modifier
                        .animateContentSize()
                        .fillMaxSize()
                        .padding(paddingValues)
                ) {
                    items(items = items.value!!) {
                        SingleItem(item = it) {
                            addNewShoppingListViewModel.removeItem(it)
                        }
                    }
                }

            } else {
                Box(
                    modifier = Modifier
                        .fillMaxSize(),
                    contentAlignment = Alignment.Center
                ) {
                    Text(
                        text = "There are no shopping Items",
                        color = Color.Red,
                        style = MaterialTheme.typography.h5
                    )
                }
            }
        }
        if (showDialog.value) {
            MyDialog(
                showDialog = showDialog,
                textFieldsViewModel = textFieldsViewModel,
            ) {
                val name = textFieldsViewModel.shoppingItemText.value
                val quantity = textFieldsViewModel.itemQuantityText.value
                val item = Item(0, name!!, quantity!!.toInt(), 0)
                addNewShoppingListViewModel.addNewItem(item)
                textFieldsViewModel.shoppingItemText.value = ""
                textFieldsViewModel.itemQuantityText.value = ""
                showDialog.value = !showDialog.value
            }
        }

    },

下面是它自己的项目的可组合的乐趣:

代码语言:javascript
复制
@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.")
        }
    }

}

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-21 20:24:30

试着换掉线路,

代码语言:javascript
复制
items.value!!.remove(item)
items.value = items.value?.plus(listOf()) as MutableList<Item>?

带着,

代码语言:javascript
复制
items.value = items.value?.filter { it != item }?.toMutableList()

问题是表达式items.value?.plus(listOf())不会产生不同的实例,并且ViewModel不会重新发布值,因为它是前一个值的==。这是因为Kotlin只会分配一个新的列表,如果一个列表表达式的操作方不等同于结果的话。

上面filter的使用确保了如果item在列表中,就会生成一个新的列表。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67202488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档