首页 > 解决方案 > 在 DataSource.Invalidate() 之后新的 PagedList 只有一页

问题描述

我有一个使用分页库实现的分页列表。此列表中的项目可以修改(更改/删除)。根据官方文档,我首先更改我DataSource从中获取页面的内存列表缓存,然后调用datasource.invalidate()以创建新对PagedList/DataSource

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

如果用户修改第一页上的项目,它可以工作并且看起来很好。

但是,如果用户在第二页或更长时间,datasource.invalidate()他将被扔到第一页的末尾

调试显示会发生这种情况,因为 newPagedList在提交到时只有第一页PagedListAdapter.submitList。适配器比较新旧列表并删除所有不是从第一页的项目。如果他在第一页上,它总是会发生但对用户不可见。

所以对我来说,看起来新的一对PagedList/DataSource不知道获取前一对的页面数量并且datasource.invalidate()不适合文档中的情况。我认为可以接受的行为然后用户更新所有列表(如刷卡刷新)但不

更新列表中的单个项目

有没有人遇到过这样的问题或以某种方式归档了我想要的东西?也许我错过了一些技巧,可以帮助我在PagedList所有页面上都获得新的东西。

为了澄清:库版本2.1.0PageKeyedDataSource基于内存缓存和远程服务的自定义(否Room

标签: androidandroid-architecture-componentsandroid-jetpackandroid-paging

解决方案


如果有人感兴趣,我想分享我的研究:

  1. 问题(“缺少功能”)是已知的,至少我在官方跟踪器一二上找到了这对夫妇相关 讨论
  2. 如果您正在使用PositionalDataSource,或者您应该按照这个答案的说法从初始参数中ItemKeyedDataSource挖掘方向。我没有太多时间来构建整个解决方案,但是这些参数对于失效后的初始加载确实不同requestedStartPosition/requestedInitialKey

关于我的情况:PageKeyedDataSource在这里你可以读到在这种类型的数据源中没有类似于requestedInitialKeyparams 的地方。尽管如此,我还是找到了一个适合我的解决方案,非常简单,但感觉就像一个肮脏的把戏:

当内存缓存返回所有已经加载的页面而不是第一个页面loadInitial()后调用。invalidate() 起初我担心某些东西会中断,例如,如果requestedLoadSize是 5,但结果是 50 个项目列表,但事实证明这只是一个提示,可以忽略。只是不要忘记传递nextPageKey对应于最后一个缓存页面而不是第一个缓存的页面。

希望它会有所帮助


推荐阅读