gpt4 book ai didi

android - 调用 submitList() 时,ListAdapter DiffUtils newItem 和 oldItem 相同

转载 作者:行者123 更新时间:2023-12-05 03:29:39 25 4
gpt4 key购买 nike

仅供引用,我并不是在寻找“修复”,而是在寻找解释和讨论,这可能有助于更多地理解像这些看似愚蠢的事情是如何工作的。

当我意识到某个地方的某个列表没有正确更新时,我正在从事这个更大的项目。仔细观察,项目正在正确修改,如果您“滚动离开”并返回,项目的信息将正确显示。

我偶然发现了这篇文章: ListAdapter not updating item in RecyclerView

但这里的不同之处在于,事实上,DiffUtils 被调用了,但不知何故 newItemoldItem 是相同的!我知道该库假设您正在使用 Room 或任何其他每次更新时都会提供新的异步列表的 ORM,但事情就是这样。如果我“天真地”提交列表,甚至不会调用 DiffUtils。但是,如果我像某些人建议的那样将列表提交为 list.toMutableList(),则会调用 DiffUtils,但不知何故,新旧项目已经相同,因此,没有任何更新时刻(通过在 areContentsTheSame 中放置断点来验证这一点)。

我在此处为您留下了相关 fragment 和指向我创建的测试项目的链接,这样我就可以封装行为并将其与其他所有内容分开测试。

fragment - 只是调用 submitList

viewModel.items.observe(viewLifecycleOwner) {
adapter.submitList(it.toMutableList())
}

View 模型

private val _items = MutableLiveData<List<SimpleItem>>()
val items: LiveData<List<SimpleItem>>
get() = _items

init {
_items.value = ItemsRepo.getItems()
}

fun onItemClick(itemId: Int) {
ItemsRepo.addItemCount(itemId)
_items.value = ItemsRepo.getItems()
}

我创建一些数据的“Repo”对象 ItemsRepo {

private var items = mutableListOf(
SimpleItem(1),
SimpleItem(2),
SimpleItem(3),
SimpleItem(4),
SimpleItem(5)
)

fun getItems(): List<SimpleItem> {
return items
}

fun addItemCount(itemId: Int) {
items.find { it.itemId == itemId }?.let {
it.itemClickCount += 1
}
}

GitHub repo : https://github.com/ellasaro/ListAdapterTest

干杯!

最佳答案

不要将可变数据类或可变列表与 DiffUtil 一起使用。它会导致各种问题。 DiffUtil 依赖于比较两个列表,因此如果其中一个是可变的并且已经更改,则它无法成功比较新旧,因为没有先前状态的记录。

我没有花时间缩小您的具体问题范围,但我敢打赌,如果您将 Repo 的 getItems() 更改为返回 items.toList()(所以改变 Repo 不会改变下游列表),并将 SimpleItem 更改为不可变类,你的问题就会消失。

不幸的是,使 SimpleItem 不可变会有点麻烦。点击监听器必须向 repo 报告更改项目的 ID,而不是更改项目, repo 必须手动将其换掉,然后您刷新列表。

如果你的 Repo 返回一个列表流,当向它报告更改时自动发出列表流,它会更干净。这样您的 ViewModel 就不必既报告更改又记得再次手动查询列表状态。

我会使用 toList() 而不是 toMutableList()。可变列表表明您计划改变列表而不是仅仅读取它,对于传递给 DiffUtil 的列表,您绝不能这样做。

关于android - 调用 submitList() 时,ListAdapter DiffUtils newItem 和 oldItem 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70992664/

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