【问题标题】:How to avoid duplicate items in PagingAdapter?如何避免 PagingAdapter 中的重复项?
【发布时间】: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


【解决方案1】:

正如@dlam 提到的,DiffUtil 不用于避免重复项。因此,我在 viewModel 中为我的数据源编写了过滤器;

return Pager(
        PagingConfig(pageSize = 20)
    ) {
        PersonPagingDataSource(dataSource, null)
    }.liveData.map {
        val personMap = mutableSetOf<Int>()
        it.filter { person ->
            if (personMap.contains(person.id)) {
                false
            } else {
                personMap.add(person.id)
            }
        }
    }
        .cachedIn(viewModelScope)

所以,当一个新项目来自 DataSource 时,它​​不会通过过滤添加到我的 livedata 中。

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多