Android Paging 3 - 从 PagingData<T> 对象获取数据列表

Posted

技术标签:

【中文标题】Android Paging 3 - 从 PagingData<T> 对象获取数据列表【英文标题】:Android Paging 3 - get list of data from PagingData<T> object 【发布时间】:2021-03-14 16:01:03 【问题描述】:

我正在使用新的 jetpack Paging 3 库。我有一个特定的用例。我想使用 viewmodel 在两个屏幕之间共享这些数据。

一个屏幕需要分页数据,而对于第二个屏幕,我想要此数据的简单列表(不是分页列表,我需要使用列表...)。我不想在 PagingData 的对象中列出。

有什么方法可以在没有 PagingData 对象的情况下获取列表?

如您所见,获取此数据没有变量。创建流程时,我什至在 viewModel 中尝试过,但没有找到解决方案。

【问题讨论】:

【参考方案1】:

PagingData 只是一个无状态的增量加载事件流,所以它不持有这种状态。

但是PagingDataAdapter/Differ(以及类似的其他演示者端变体)已经需要保存数据,因此它们公开了诸如 PagingDataAdapter.snapshot() 之类的 API,它可以为您提供当前呈现项目的列表。

请记住,呈现的数据是转换后的数据,可能不包括由于超过 maxSize 而被丢弃的页面,并且还可能与 fetcher 竞争,因为在加载数据和显示数据之间需要一些时间在用户界面中。

这实际上取决于您对精确跟踪感兴趣的内容,但是从 fetcher 方面(跟踪预转换),您可以根据 PagingSource 返回的结果构建列表,也可以编写一个 no-op 。 PagingData 上的 map() 运算符,它将查看每个项目(但不会为您提供有关订单的信息)。

不幸的是,Paging3 还没有提供可以为您构建此状态的非 UI 收集器(在测试中最有用),但希望我们将来可以研究一下。

【讨论】:

目前唯一的方法是使用像diff这样的presenter api从中收集并在加载后拍摄快照。请注意,这并不意味着 UI 测试,只是 android 测试。我还强烈建议单独测试组件(PagingSource 可直接调用等) @dlam 对于我的用例,我对在密封视图状态对象中保存数据感兴趣。 目前没有直接从 PagingData 收集内部 PageEvents 的公共 api 方式,因此您无法在没有反射的情况下重新创建 Presenter API 跟踪的状态。此外,我希望它在未来的版本中会发生变化,所以我什至不会尝试它——尽管我们正在寻找更独立的可测试性并希望更多地开放 API。它只是需要时间,因为一旦我们打开它,我们就无法收回它,因为人们会依赖它的稳定性,所以我们必须确保我们正确地设计它。【参考方案2】:

要扩展dlam的评论,可以检索PagingData的数据列表,只要它连接到PagingDataAdapter,或者如果@ 987654324@结果提交到AsyncPagingDataDiffer

为此,调用

adapter.snapshot().items

如果连接到PagingDataAdapter,或者

differ.snapshot().items

如果连接到AsyncPagingDataDiffer

【讨论】:

以上是关于Android Paging 3 - 从 PagingData<T> 对象获取数据列表的主要内容,如果未能解决你的问题,请参考以下文章

Android Paging 3 - 从 PagingData<T> 对象获取数据列表

将 Paging 3 alpha 更新为稳定导致索引问题 Android

在 Paging 3 库 Android Kotlin 中更新当前页面或更新数据

如何从PowerShell中的格式化文本创建对象

Android Paging 3 不显示 Loadstate Adapter

使用 Jetpack Compose 无限加载 Android Paging 3 库而无需滚动