android - PagedList RecyclerView 在 pagedList 失效后跳转

标签 android android-recyclerview android-jetpack android-paging epoxy

设置:

我们正在使用 PagedListEpoxyController , RxPagedListBuilder , ItemKeyedDataSource运行时 Mockgenerator它只是根据生成的数据索引创建一个用户,例如。 user1, user100, user500

分页配置为:

val pageSize = 50
val initialLoadSizeHint = 80
val prefetchDistance = 16

预期行为

每当我们向下滚动到400项并返回300项并通过单击关注/取消关注 UI 跳转使列表无效。单击按钮时,PagedList 将像这样无效:

enter image description here

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/

相关文章:

android - 如何使用 View 绑定(bind)制作 BaseFragment

android - 以横向模式启动 Android 应用程序

java - Android aar库混淆

android - Recycler View (水平)有两个项目占父宽度的 50%

android - 我的 RecyclerView 没有得到适当的通知

android - 如何使用导航 Controller 组件设置不同的工具栏?

java - 如何在重绘时保存先前绘制到 Canvas 上的对象?

android - 如何在 DatePickerDialog Android 中禁用今天日期之后的日期?

android - RecyclerView getLayoutParams 返回 null(有时)

android - 为什么 jetpack compose 预览需要几分钟才能加载?