android - 在 DataSource.Invalidate() 之后新的 PagedList 只有一页
问题描述
我有一个使用分页库实现的分页列表。此列表中的项目可以修改(更改/删除)。根据官方文档,我首先更改我DataSource
从中获取页面的内存列表缓存,然后调用datasource.invalidate()
以创建新对PagedList/DataSource
:
如果您有更精细的更新信号,例如网络 API 发出对列表中单个项目的更新信号,建议将数据从网络加载到内存中。然后通过包装内存快照的 DataSource 将该数据呈现给 PagedList。每次内存中的副本更改时,都会使先前的 DataSource失效,并且可以创建一个包装快照新状态的新数据源。
如果用户修改第一页上的项目,它可以工作并且看起来很好。
但是,如果用户在第二页或更长时间,datasource.invalidate()
他将被扔到第一页的末尾。
调试显示会发生这种情况,因为 newPagedList
在提交到时只有第一页PagedListAdapter.submitList
。适配器比较新旧列表并删除所有不是从第一页的项目。如果他在第一页上,它总是会发生但对用户不可见。
所以对我来说,看起来新的一对PagedList/DataSource
不知道获取前一对的页面数量并且datasource.invalidate()
不适合文档中的情况。我认为可以接受的行为然后用户更新所有列表(如刷卡刷新)但不
更新列表中的单个项目
有没有人遇到过这样的问题或以某种方式归档了我想要的东西?也许我错过了一些技巧,可以帮助我在PagedList
所有页面上都获得新的东西。
为了澄清:库版本2.1.0
。PageKeyedDataSource
基于内存缓存和远程服务的自定义(否Room
)
解决方案
如果有人感兴趣,我想分享我的研究:
- 问题(“缺少功能”)是已知的,至少我在官方跟踪器一二上找到了这对夫妇相关的 讨论
- 如果您正在使用
PositionalDataSource
,或者您应该按照这个答案的说法从初始参数中ItemKeyedDataSource
挖掘方向。我没有太多时间来构建整个解决方案,但是这些参数对于失效后的初始加载确实不同requestedStartPosition/requestedInitialKey
关于我的情况:PageKeyedDataSource
。在这里你可以读到在这种类型的数据源中没有类似于requestedInitialKey
params 的地方。尽管如此,我还是找到了一个适合我的解决方案,非常简单,但感觉就像一个肮脏的把戏:
当内存缓存返回所有已经加载的页面而不是第一个页面loadInitial()
后调用。invalidate()
起初我担心某些东西会中断,例如,如果requestedLoadSize
是 5,但结果是 50 个项目列表,但事实证明这只是一个提示,可以忽略。只是不要忘记传递nextPageKey
对应于最后一个缓存页面而不是第一个缓存的页面。
希望它会有所帮助
推荐阅读
- ssh - 打开网络,无法连接到我的设备(两台linux笔记本电脑和Android智能手机,),最好是SHH
- wordpress - Wordpress 网站中字体加载速度慢
- javascript - 如何使用 javascript for-loop 和 if-statement 在右表中显示数据?
- python - 数据分页时访问 Django-admin 页面上的页码
- amazon-web-services - 我无法通过 SQL 开发人员连接到我的 ORACLE RDS
- python - Dash Plotly 仪表板更新仪表板按钮
- pandas - 我们可以以这种方式使用 group by 吗?
- mysql - 如果满足条件,则将值替换为其他值
- python - 我无法在 python 中打印由字典制作的数据框
- arrays - 如何通过单击标题以升序或降序对表格列进行排序