在DataSource.Invalidate()之后,新的PagedList只有一页

ylu*_*lus 6 android android-architecture-components android-jetpack android-paging

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

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

如果用户修改首页上的项目,它会正常工作,并且看起来很好。

但是,如果用户在第二页或第二页以上,datasource.invalidate()则将其扔到第一页的末尾

调试表明这种情况是因为新的PagedList具有唯一的第一页时,它的提交PagedListAdapter.submitList。适配器比较旧列表和新列表,并从第一页中删除所有项目。它总是发生,但如果用户在第一页上,则对用户不可见。

所以对我来说,似乎新的对PagedList/DataSource不知道获取前一对的页面数datasource.invalidate()不适合文档中的情况。我认为适用于某些情况的行为,然后用户更新了所有列表(例如刷卡刷新),但没有更新

列表中单个项目的更新

是否有人遇到过此类问题或以某种方式存档了我想要的东西?也许我缺少一些技巧,可以帮助我在PagedList所有页面上获得新的知识。

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

ylu*_*lus 5

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

  1. 发行(“功能的缺失”)是已知的,至少我发现官方跟踪夫妇相关讨论一个 2
  2. 如果您正在使用PositionalDataSourceItemKeyedDataSource应该requestedStartPosition/requestedInitialKey按照此答案所述从初始参数中挖掘方向。我没有太多时间来构建整个解决方案,但是对于无效后的初始加载,这些参数确实有所不同

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

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

希望对你有帮助