在Android分页库中,如何使PagedList或DataSource中的数据集子集无效?我写PagedList或DataSource是因为我不知道该调用哪一个。
例如,我正在制作一个名为BufferOverflow的QA应用程序。
我有一个通过网络加载数据的PageKeyedDataSource
。它支持通过API上的索引进行分页。在那个应用程序中,我有一个热门问题屏幕,上面有"无限"的热门问题列表。当然,最重要的问题会定期更新。
如何:
- 是否更新第1页的数据集
- 是否更新第10页的数据集
我知道使用PagedList的好处是,它可以使用DiffUtil
计算哪些项目是新的/旧的。但是,我如何告诉它某些key
或position
上的数据集发生了变化?
我的要求是不可能的吗?我应该自己实现自定义分页行为吗?
注意:
- 我不想使所有数据无效
adapter.getCurrentList().getDataSource().invalidate();
这将使数据源上的整个数据无效。而我只是想使数据的某些部分无效。
- 我认为我正在寻找的API类似于RecyclerView.Adapter的
list.adapter.notifyItemChanged(0);
当然,更新数据集不是适配器的责任。它在PagedList
、DataSource
或Dao类上。。
解决这个问题的唯一方法是在Room中引入一个持久层。https://github.com/googlesamples/android-architecture-components/tree/master/PagingWithNetworkSample#paging-带有数据库和网络
根据此处的文档:https://developer.android.com/reference/androidx/paging/DataSource#updating-分页数据
如果您有更细粒度的更新信号,例如网络API向列表中的单个项目发出更新信号,建议将数据从网络加载到内存中。然后将该数据呈现给PagedList通过包装内存中快照的DataSource。每次内存中的副本发生更改,使以前的DataSource无效,并且可以创建包装快照的新状态的新快照。
https://developer.android.com/topic/libraries/architecture/paging/data#consider-内容更新
在构建可观察的PagedList对象时,请考虑内容更新工作。如果直接从文件室数据库加载数据更新会自动推送到应用程序的用户界面。