1

在 Android分页库中,如何使 PagedList 或 DataSource 中的数据集子集无效?我写 PagedList 或 DataSource 是因为我不知道应该调用哪一个。

例如,我正在制作一个名为BufferOverflow的 QA 应用程序。

我有一个PageKeyedDataSource通过网络加载数据。它支持通过 API 上的索引进行分页。在那个应用程序中,我有一个热门问题屏幕,其中包含“无限”的热门问题列表。当然,最重要的问题会定期更新。

如何:

  1. 更新第 1 页的数据集?
  2. 在第 10 页更新数据集?

我知道使用 PagedList 的好处是它会计算哪个项目是新的/旧的,使用DiffUtil. 但是,我如何告诉它数据集上的某些keyposition已更改?

我问的是不可能的吗?我应该自己实现自定义分页行为吗?


笔记:

  1. 我不想使所有数据无效。

adapter.getCurrentList().getDataSource().invalidate();

这将使数据源上的整个数据无效。虽然我只想使数据的某些部分无效。

  1. 我认为我正在寻找的 API 类似于 RecyclerView.Adapter 的

list.adapter.notifyItemChanged(0);

但当然,更新数据集不是适配器的责任。它在PagedListDataSource或 Dao 类中。

4

1 回答 1

0

解决这个问题的唯一方法是在 Room 中引入一个持久层。 https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample#paging-with-database-and-network

根据此处的文档:https ://developer.android.com/reference/androidx/paging/DataSource#updating-paged-data

如果您有更精细的更新信号,例如网络 API 发出更新列表中单个项目的信号,建议将数据从网络加载到内存中。然后通过包装内存快照的 DataSource 将该数据呈现给 PagedList。每次内存中的副本更改时,都会使先前的 DataSource 失效,并且可以创建一个包装快照新状态的新数据源。

https://developer.android.com/topic/libraries/architecture/paging/data#consider-content-updates

在构建可观察的 PagedList 对象时,请考虑内容更新的工作方式。如果您直接从 Room 数据库加载数据,更新会自动推送到您的应用程序的 UI。

于 2019-06-08T23:53:03.020 回答