【问题标题】:Don't clean up RecyclerView on PagedList invalidation不要在 PagedList 失效时清理 RecyclerView
【发布时间】:2020-04-15 23:01:52
【问题描述】:

我正在使用来自 Android Jetpack 的 Paging 库在我的 RecyclerView 中进行分页加载行为。我直接从网络加载,所以我没有任何中间内存缓存或数据库。每当发生变化时,我都会在DataSource(在我的情况下为PositionalDataSource)上调用invalidate(),以便刷新列表。

我需要的是非常简单的东西——一旦我调用invalidate(),回收器视图就会被完全清理并显示空数据。我需要回收站视图来保留旧数据并在新数据进入后正常更新。在大多数情况下,更新可能非常小,例如按钮颜色在几行中发生变化,RecyclerView 时看起来很难看当我从后端加载数据时,显示几秒钟的空白内容。

这能否以某种方式完成,或者当前分页库架构是否存在概念上的限制,迫使我实现自己的缓存?

【问题讨论】:

  • 如果你是直接从网络加载,那它怎么是PositionalDataSource而不是ItemKeyed或PageKeyed数据源?
  • 那是后端的api,请求有start index和count的参数
  • 我相信 LiveData<PagedList<T>> 应该能够保持以前的值,除非它被来自数据源的新值覆盖。我想真正的问题是为什么你只是通过无效但还没有数据来获得一个新的 PagedList 。如果是强制的,也许空响应可以忽略...?
  • 好吧,触发数据加载的唯一方法就是使数据源失效。但是每当我这样做时,回收器视图都会清理 UI。 PagedList 中有一个 detach 函数,一旦我检测到我需要重新加载我的对象,它就可以保持回收器视图的旧状态。但是,由于 PagedList 会自动触发后端调用,所以在 detach 之后什么都不会发生。
  • 我认为存在概念上的问题,这就是Android在失效后清理UI的原因。想象一下,我加载了 20 个对象,一段时间后意识到需要再次从后端获取第 5 个对象。我将使数据源无效,并且 Recycler 视图将开始从后端获取对象,但保留旧 UI,如我所愿。如果获取时间太长 - 我可以上下滚动并弄乱一切,回收器视图将需要根据当前滚动位置再次获取,因为项目的加载取决于 UI 上下文。唯一的方法是拥有 1 个事实来源 - 本地缓存。

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


【解决方案1】:

调用 notifyDataSetChanged 而不是 invalidate 作为一个简单的解决方案可能会有所帮助。

【讨论】:

  • 但这不会触发我后端的数据刷新。我希望分页库能够控制加载数据。想象一下,我滚动到位置 100-120,然后发生了一些可能会改变数据的事情。调用 invalidate 将触发对我的后端的网络调用以获取项目 100-120,而调用 notifyDataSetChanged 只会向回收器视图发出信号以重绘项目。但是,这些项目尚未更改,因为没有触发新的后端提取。
猜你喜欢
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2015-11-21
相关资源
最近更新 更多