我正在创建一个应用程序,除其他外,它使用户能够添加消费者,然后稍后将其删除。消费者显示在卡片中,最后有一个删除按钮。
添加消费者效果很好。但是,当我尝试删除消费者时,应用程序屏幕中删除的始终是消费者last one。我知道这不是一个逻辑实现错误,因为我在items()
调用,并且在任何重组中,持有消费者的列表都会删除正确的消费者!下图显示了单击删除按钮后的结果"B"卡(被移除的卡是"C"!):
在重组发生之前查看调试器显示的内容:
相关代码如下。
ViewModel 和 Model(相关部分)定义:
class ConsumidoresViewModel : ViewModel() {
var lista = mutableStateListOf<Consumidor>()
fun add(consumidor: Consumidor){
lista += consumidor
}
fun remove(consumidor: Consumidor){
lista.remove(consumidor)
}
}
data class Consumidor(var nome: String)
...
主要可组合项,直接从 .onCreate() 调用:
fun UsersView() {
var consumidores: ConsumidoresViewModel = viewModel()
...
LazyColumn() {
items(items = consumidores.lista) { consumidor ->
CardNome(consumidor, consumidores)
}
}
删除按钮的函数调用:
IconButton(onClick = { consumidorViewModel.remove(consumidor) }) { ... }
我不明白我做错了什么。我对 Android 编程/撰写相当陌生,但我已经编程了几十年(不是专业的)。有人能给我指出一个方向吗?它可能与我的 Sates / View Model 实现有关,但我无法找出是什么,因为SnapshotStateList
调试器上清楚地显示"A" and "C"存在卡片,并且"B" gone!
以官方为准docs https://developer.android.com/jetpack/compose/lists#item-keys.
默认情况下,每个项目的状态都根据该项目在列表或网格中的位置进行设置。但是,如果数据集发生更改,这可能会导致问题,因为更改位置的项目实际上会丢失任何记住的状态。如果您想象一下 LazyColumn 中的 LazyRow 场景,如果该行更改了项目位置,则用户将丢失该行中的滚动位置。
因此,当您的数据类具有独特的属性(例如id
如果您打算操作它的集合(例如删除操作),则可以将其用作key = {...}
为了LazyColumn
所以它知道不要使用索引作为其唯一标识符item elements
,这可能就是为什么从列表中删除元素后项目显示错误的原因。
LazyColumn() {
items(items = consumidorList, key = { it.id }) { consumidorItem ->
...
}
}
Update:
Linking https://stackoverflow.com/questions/74381205/removing-item-from-the-list-causes-wrong-display-in-lazycolumn/74383091#74383091我的另一个答案movableContentOf{...} https://effectiveandroid.substack.com/p/movablecontentof-and-movablecontentwithreceivero sample.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)