gpt4 book ai didi

android - 删除项目时,LazyColumn 显示错误

转载 作者:行者123 更新时间:2023-12-05 04:21:27 25 4
gpt4 key购买 nike

我正在创建一个应用程序,除其他外,它使用户能够添加消费者,然后再将其删除。消费者显示在最后带有删除按钮的卡片中。

enter image description here

添加消费者工作正常。但是,当我尝试删除消费者时,应用屏幕中删除的始终是最后一个。我知道这不是逻辑实现错误,因为我在 items() 调用之前停止了调试器,并且在任何重组中,包含消费者的列表都删除了正确的消费者!下图显示了从 “B” 卡片中点击移除按钮后的结果(移除的卡片是 “C”!):

Consumer removed should be B

看看调试器在重组发生之前显示了什么:

enter image description here

相关代码如下。

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" 和 < strong>“C” 牌出现,“B” 消失了!

最佳答案

基于官方docs .

By default, each item's state is keyed against the position of the item in the list or grid. However, this can cause issues if the data set changes, since items which change position effectively lose any remembered state. If you imagine the scenario of LazyRow within a LazyColumn, if the row changes item position, the user would then lose their scroll position within the row.

因此,当您的数据类具有像 id 这样的唯一属性时,如果您打算操作它的集合(例如您的删除操作),那么它通常是一个很好的设置,然后您可以将它用作LazyColumnkey = {...} 因此它知道不要将索引用作其 item 元素 的唯一标识符,并且这可能是您在从列表中删除元素后项目显示错误的原因。

LazyColumn() {
items(items = consumidorList, key = { it.id }) { consumidorItem ->
...
}
}

更新:

Linking我的另一个答案 movableContentOf{...}样本。

关于android - 删除项目时,LazyColumn 显示错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74189857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com