【发布时间】:2021-09-22 13:04:43
【问题描述】:
我已经为我的 android 项目实现了 paging3。为了避免重复项,我创建了一个 DiffUtil.ItemCallback 对象,如下所示;
companion object {
val diffCallback = object : DiffUtil.ItemCallback<Person>() {
override fun areItemsTheSame(oldItem: Person, newItem: Person): Boolean {
return oldItem.id == newItem.id
}
override fun areContentsTheSame(oldItem: Person, newItem: Person): Boolean {
return oldItem.id == newItem.id
}
}
}
我在 PagingDataAdapter 中使用了该对象;
class PersonAdapter : PagingDataAdapter<Person, PersonViewHolder>(diffCallback)
在 View 中,我从 viewModel 获取 PaginData 并将其提交到适配器。
private fun observeData() {
lifecycleScope.launch {
viewModel.getPeople().observe(this@MainActivity, {
pagingAdapter.submitData(lifecycle, it)
})
}
在我看来,由于 DiffUtil.ItemCallback,具有相同 id 的人不会被包含在适配器中。但它没有发生。 RecyclerView 打印每个 person 对象,即使它们具有相同的 id。
如何通过 id 区分数据?为什么 DiffUtil.ItemCallback 不起作用?谢谢。
【问题讨论】:
-
您使用的是什么方法?只有网络或数据库+网络与remoteMediator?也许您的数据库中可能有重复的项目..
-
@Andy 我有意从我的数据库中发送重复的项目,看看它是如何工作的。我认为使用 DiffUtil 将帮助我不打印相同的项目,即使它们来自后端。
-
DiffUtil 不用于对列表中的项目进行重复数据删除,它是 RecyclerView 的实用程序,用于确定需要进行哪些更改才能呈现新列表。也就是说,它不过滤新列表,它只是计算两个列表之间的差异。
-
项目重复数据删除实际上可以通过将从网络获取的项目写入数据库,在冲突中覆盖该数据库(如果第 n 页可以包含第 n - 1 页中的一些项目,这很有用)
-
我现在知道了,谢谢@dlam
标签: android kotlin android-paging-3 android-diffutils