【发布时间】:2022-02-04 20:46:01
【问题描述】:
仅供参考,我并不是在寻找“修复”,而是寻求解释和讨论,这可能有助于更多地了解这些看似愚蠢的事情是如何运作的。
当我意识到某个地方的某个列表没有正确更新时,我正在从事这个更大的项目。仔细观察,项目正在被正确修改,如果您“滚动离开”并返回,项目的信息将正确显示。
我偶然发现了这篇文章: ListAdapter not updating item in RecyclerView
但这里的不同之处在于,实际上调用了 DiffUtils,但不知何故 newItem 和 oldItem 是相同的!我了解该库假设您使用的是 Room 或任何其他 ORM,每次更新时都会提供一个新的异步列表,但这就是问题所在。如果我“天真”地提交列表,则甚至不会调用 DiffUtils。但是,如果我像某些人建议的那样以list.toMutableList() 提交列表,则会调用 DiffUtils,但不知何故,新旧项目已经相同,因此,此时没有任何更新(通过在 @ 中放置断点来验证这一点987654326@).
我将相关的 sn-ps 和一个指向我创建的测试项目的链接留在这里,以便我可以封装行为并将其与其他所有内容分开测试。
片段 - 只是调用 submitList
viewModel.items.observe(viewLifecycleOwner) {
adapter.submitList(it.toMutableList())
}
视图模型
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()
}
“回购”我创建了一些数据 对象项目回购 {
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 存储库: https://github.com/ellasaro/ListAdapterTest
干杯!
【问题讨论】:
标签: android kotlin android-recyclerview listadapter android-diffutils