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 中更新当前页面或更新数据