设置:
我们正在使用 PagedListEpoxyController
, RxPagedListBuilder
, ItemKeyedDataSource
运行时 Mockgenerator
它只是根据生成的数据索引创建一个用户,例如。 user1, user100, user500 等
分页配置为:
val pageSize = 50
val initialLoadSizeHint = 80
val prefetchDistance = 16
预期行为
每当我们向下滚动到第400项并返回到300项并通过单击关注/取消关注 UI 跳转使列表无效。单击按钮时,PagedList 将像这样无效:
followers.dataSource.invalidate()
loadInitial()
里面ItemKeyedDataSource
应该用 params.key
的值调用这样我们就可以得到之前显示的相同页面重新显示。例如,如果 user300 在屏幕中可见,则该项目 requestedInitialKey
应该在 [user221,user280] 范围内。
问题出在哪里?
last item that was fetched in the pagedList
的分页库轨道失效前but does not
提供一种方法来知道哪个是 last item/range that was visible
在无效之前的屏幕上。
使 pagedList 失效后,第一个在 pagedList 失效后调用的回调是 loadInitial(params : LoadInitialParams, callback : LoadInitialCallback)
与 params
仅包含有关 pageSize 和占位符的信息以及 requestedInitialKey
作为last item that was fetched
在无效之前,这是非常具有误导性的。为什么,after invalidation
pagedList 做 request
在列表中获取的最后一项作为 requestedInitialKey / item in the firstPage
而不是 the last item that was displayed before invalidation
?。抱歉,如果我完全误解了这件事但无法真正理解它。
问题:
我希望pagedList
从上一个滚动位置而不是上一个pagedList 中的最后一项 失效后开始获取新PagedList 中的第一页。
但是,如果 PagedList 不应该以这种方式工作,那么我如何知道在失效之前屏幕上以前可见的任何项目/索引?
如果我目前也做不到,实现此要求的推荐方法是什么?
这个问题可以在这里找到:
要重现:向下滚动足够远(如第 60 项)并按 “刷新”,您将看到列表中的跳转。 Link to github issue
最佳答案
我们解决这个问题的方法是,UI 仅从 Room 数据库中监听作为单一事实来源。该设置中不存在此问题。但是当我们使用 ItemKeyedDatasource 时,这个问题一直存在到现在。
关于android - PagedList RecyclerView 在 pagedList 失效后跳转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56573909/