DataSource - Android 动态增长列表的分页

DataSource - Android Paging with dynamically growing list

我正在尝试使用 DataSource 实施以及 PagedAdapter.

在 Android 上实施分页

最初,要求是在内存中有一个完整的列表(不使用 RoomDB),我想在用户滚动时对该数据进行移动“查看”——即将它以页面形式提供给适配器。我已经通过使用 PositionalDataSource.

实现了这一点

但是,现在我有一个新的要求。原始完整列表中的某些项目实际上是“加载”项目(即微调器),我需要获取这些单元格以块表示的数据。这些块具有未确定的大小。当一个块加载时,“loading”项应该在列表中向下移动,加载的块被插入到“loading”项原来所在的位置。这应该一直持续到“loading”项代表的所有块都已加载,此时列表末尾的“loading”项应该被删除。

这意味着,我的基础数据源实际上会随着用户滚动列表而动态增长。我认为这意味着 PositionalDataSource 不是用作源文档状态的正确数据源类型:

 * Position-based data loader for a fixed-size, countable data set, supporting fixed-size loads at
 * arbitrary page positions.

强调 fixed-sizecountable - 显然我的数据集不是固定大小的(因此也是不可数的)。

我查看了 DataSource 的其他实现,并认为我找到了正确的实现; ItemKeyedDataSource。我的每个项目确实都有一个唯一的密钥,这个 class 的源文档声明:

 * Incremental data loader for paging keyed content, where loaded content uses previously loaded
 * items as input to future loads.

这对我来说表明我可以将它用于我需要的目的。 IE。当它需要加载具有给定键的项目的范围时,该项目也恰好是“正在加载”项目,它可以使用加载项目数据来确定要加载的内容。

但是,我在实际实现时遇到了一些困难,因为官方文档没有给出任何真实的示例用法,示例代码的链接假定​​使用 RoomDB 或改造,两者都不是我需要的方法。

任何人都可以帮助我概述此 DataSource 在使用需要动态增长的内存数据集的代码示例中应该如何在概念上运行 and/or 吗?

我意识到这很模糊,我今天早上才开始使用这个 class,但我正在努力。

Paging 已经为您加载分页数据 - 实现 DataSource 的目的是为 Paging 提供一种方法,以便在用户滚动到接近尾部时逐步加载更多数据。需要注意的是,在 Paging 2.x 中,加载状态并未内置到库中,因此您需要自己跟踪它并使用 ConcatAdapter 等方法显示微调器。

如果您想尝试 v3 api(仍处于测试阶段),LoadState 是一个内置概念,您只需使用 .withLoadStateFooter() 转换即可将 PagingDataAdapterConcatAdapter,它会在 Paging 获取新页面时自动显示加载微调器。

澄清文档中关于计数快照的部分 - Paging 使用单一真实来源 (DataSource / PagingSource),它应该代表一个静态列表(一旦完全加载) ).这并不意味着您必须将整个列表存储在内存中,但是 DataSource 提取的每个实例的项目通常应该与静态列表的心理模型相匹配。例如,如果您正在从数据库中分页数据,那么 DataSource / PagingSource 的单个实例仅在数据库中没有更改时才有效。一旦你插入/修改/删除一行,该实例就不再有效,这就是 DataSource.Factory 发挥作用的地方,给你一个新的 PagedList / DataSource 对。

现在,如果您还需要通过分层源方法增量更新支持数据集(本示例中的数据库),Paging v2 提供了一个 BoundaryCallback,您可以注册以在 Paging 加载数据不足时触发网络提取,或者或者在 v3 中,新的 API 是 RemoteMediator(仍处于试验阶段)。