【问题标题】:LazyColumn is showing items that has been deletedLazyColumn 显示已删除的项目
【发布时间】:2022-11-07 17:18:47
【问题描述】:

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

添加消费者工作正常。但是,当我尝试删除消费者时,在应用程序屏幕中删除的始终是最后一个.我知道这不是逻辑实现错误,因为我在items() 调用之前停止了调试器,并且在任何重组中,保存消费者的列表都删除了正确的消费者!下图显示了单击删除按钮后的结果“乙”卡(取出的卡是“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 清楚地表明了这一点“一个”“C”存在的卡片,以及“乙”走了!

【问题讨论】:

  • 您是否尝试过根据其独有的某些内容从列表中删除 Consumidor 的实例?喜欢consumidor.Id

标签: android-jetpack-compose lazycolumn compose-recomposition


【解决方案1】:

当您的数据类具有像 id 这样的唯一属性时,如果您打算操作它的集合(例如您的删除操作),通常这是一个很好的设置,然后您可以将它用作 key = {...}LazyColumn所以它知道不使用索引作为其item elements 的唯一标识符,这可能是删除错误项目的原因。

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

当你删除一个项目时,你可以使用它唯一的id而不是它的引用,所以如果你的Consumidor有一个Id,你可以用它从列表中删除对象,比如这个。

fun remove(consumidor: Consumidor){
      lista.removeIf { it.id == consuminador.id }
}

或者也许您的删除会起作用,但我不确定,您可以尝试我的建议或保留您的删除实施。

【讨论】:

  • 我真的不明白这背后的概念,但使用一个独特的参数作为关键工作!我觉得很奇怪,从列表中删除的项目一直是正确的,但 UI 是错误的。
猜你喜欢
  • 2022-11-14
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多