【问题标题】:PagedList RecyclerView jumping after pagedList invalidationPagedList RecyclerView在pagedList失效后跳转
【发布时间】:2019-10-27 15:49:04
【问题描述】:

设置:

我们正在使用PagedListEpoxyControllerRxPagedListBuilderItemKeyedDataSource 和运行时Mockgenerator,它只是根据生成的数据索引创建用户,例如。 user1、user100、user500

分页配置为:

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

预期行为

每当我们向下滚动到第400项并返回到第第300项和通过点击关注/取消关注 UI 跳转使列表无效。单击按钮时,PagedList 无效,如下所示:

followers.dataSource.invalidate()

ItemKeyedDataSource 内的loadInitial() 应该使用params.key 的值调用,这样我们就可以获得之前显示的相同页面以重新显示。例如,如果 user300 在屏幕中可见,则该项目 requestedInitialKey 应该在 [user221,user280] 范围内。 p>

问题出在哪里?

失效前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

【问题讨论】:

  • 有什么更新吗?我的项目也有同样的问题。

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


【解决方案1】:

我们解决此问题的方法是,UI 仅从房间数据库中侦听作为单一事实来源。该设置中不存在此问题。但是当我们使用 ItemKeyedDatasource 时,这个问题一直持续到现在。

【讨论】:

  • 端点接受过滤器参数的PageKeyedDataSource怎么样?在这种情况下如何缓存它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2020-04-28
  • 2015-10-12
  • 2017-05-10
  • 1970-01-01
相关资源
最近更新 更多