LazyColumn 删除项目时显示错误

2024-02-20

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

添加消费者效果很好。但是,当我尝试删除消费者时,应用程序屏幕中删除的始终是消费者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(使用前将#替换为@)

LazyColumn 删除项目时显示错误 的相关文章

随机推荐

  • 加载动画png [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我正在寻找一个透明的动画加载图标 然而 我知道我很懒 我不想自己做 如果这不是这篇文章的正确论坛 请原谅我 我过去在这里运气很好 有谁知道我在哪里可以
  • 将管道/连接作为上下文参数传递给多处理 Pool.apply_async()

    我想使用管道与池中的流程实例进行通信 但出现错误 让 p 成为 Pool 的一个实例 master pipe worker pipe Pipe self p apply async worker task handler info cont
  • JavaScript 全局变量

    我应该如何创建一个变化变量作为全局变量 所以像这样 function globVar variable window variable 因此 通过这种方式 我也可以在自动模式下创建全局变量 而且我也可以更轻松地为自己创建它们 EDIT 例如
  • 尝试向 MYSQL 表添加新列时失去连接

    我正在尝试向拥有超过 2500 万行的 mysql 表添加一列 我正在运行 sql 命令 ALTER TABLE table name ADD COLUMN column name varchar 128 NULL DEFAULT NULL
  • 第三方API的Cors问题

    我很难从浏览器上的第三方 api 获取数据 https www coinexchange io api v1 getmarkets https www coinexchange io api v1 getmarkets I set mode
  • Git:管理我的应用程序的每个版本?

    我正在使用 git 和 github 并且刚刚完成了 iOS 应用程序的 1 0 版本 从这里开始 我想知道 git 如何才能最好地为我服务 我真的只是在这里寻找最佳实践 以及其他人推荐的管理主要版本的方法 我应该为每个新版本 例如 1 1
  • 从 vba 调用 MS SQL Server 标量 UDF

    我正在对连接到 SQL Server 2005 后端的 Access 2007 accdb 而不是 adp 前端进行编程 我怎样才能打电话scalar我的 vba 代码中的用户定义函数 Dim rst As ADODB Recordset
  • Pywinauto:无法将窗口带到前台

    致力于使用 Python 驱动的自动化工具 想象一下有一个正在运行的应用程序池 APPS POOL Chrome SomeApp Foo 该脚本在循环中运行 每秒 并且需要在它们之间随机切换 Init App object app appl
  • 递归推送所有子模块

    我编写了以下脚本来推送工作区中的所有更改 包括子模块和超级项目 然而 听起来有点奇怪 做我想做的事情是如此复杂 我缺少的还有更好的方法吗 bin bash if ne 1 then echo Illegal number of parame
  • 在 XPath 中使用翻译函数会出现错误

    我必须执行不区分大小写的 XML 搜索 我已经编写了运行良好的 XPath 表达式 但是当我使用translateXPath 表达式内的函数我收到错误 下面是运行良好的 XPath 表达式 string upper ABCDEFGHIJKL
  • 控制台中出现错误:无法加载资源:net::ERR_CONNECTION_RESET

    我刷新了我的应用程序页面并在控制台中收到此错误Failed to load resource net ERR CONNECTION RESET 我尝试重新安装 XAMPP 版本 但这对我不起作用 我认为你正在使用铬 问题是证书不匹配或证书过
  • Android 模拟器在 Ubuntu 11.10 上崩溃

    我在 Ubuntu 11 10 32 位 机器上安装了 Android SDK 我还安装了 Eclipse 3 7 和相关的 Android 开发插件 全部在 openjdk6 上 使用 eclipse 我成功创建了一个 Android 虚
  • Swift distance() 方法抛出致命错误:无法增加 endIndex

    我试图在字符串中找到子字符串匹配 并获取匹配的位置 我无法弄清楚以下代码有什么问题 let str1 hello let cmp let searchRange Range start str1 startIndex end str1 en
  • 浏览器中 bash 命令的代码块忽略路径

    我正在尝试开发一种用户友好的方式来设计 bash 命令的代码突出显示样式 我将使用以下示例来澄清问题这一页 https themeaningfulengineer github io Linux kernel in QtCreator 在下
  • IIS URL 重写规则

    我有一个 AngularJS 应用程序 它利用 URL 重写进行链接 我的重写规则如下
  • 移动设备注册 Spring Social

    我正在尝试将 Spring Social 用于我的 REST 服务和移动应用程序 我想知道最好的方法是什么 我打算使用linkedin google 登录和密码验证在我的里面移动应用 这个社交登录应该是连接到我的数据库中的用户 我的 Spr
  • 使用 Geopandas,如何选择不在多边形内的所有点?

    我有一个包含芝加哥地址的 DataFrame 我已将其地理编码为纬度和经度值 然后编码为 Point 对象 使 DataFrame 成为 GeoDataFrame 芝加哥以外的一小部分使用 LatLong 值进行了错误的地理编码 我有一个芝
  • cc1plus:错误:g++ 无法识别命令行选项“-std=c++11”

    我正在尝试使用编译g 以及 std c 11 or c 0x flags 但是 我收到这个错误 cc1plus error unrecognized command line option std c 11 g 版本 g GCC 4 1 2
  • settings.py 中模板文件夹的 Django 路径不正确

    我正在学习 Django 并且正在遵循学习 Django 1 11教程 这是我当前的项目树 manage py muypicky init py old settings py settings base py Contains the s
  • LazyColumn 删除项目时显示错误

    我正在创建一个应用程序 除其他外 它使用户能够添加消费者 然后稍后将其删除 消费者显示在卡片中 最后有一个删除按钮 添加消费者效果很好 但是 当我尝试删除消费者时 应用程序屏幕中删除的始终是消费者last one 我知道这不是一个逻辑实现错