关于android:恢复-RecyclerView-的滚动位置

6次阅读

共计 1232 个字符,预计需要花费 4 分钟才能阅读完成。

您可能在开发过程中遇到过这种状况,在 Activity/Fragment 被从新创立后,RecyclerView 失落了它之前保有的滚动地位信息。通常这种状况产生的起因是因为异步加载 Adapter 数据,且数据在 RecyclerView 须要进行布局的时候尚未加载实现,导致 RecyclerView 无奈复原到之前的滚动地位。

从  1.2.0-alpha02 版本开始,Jetpack RecyclerView 提供了一个新的 API,能够让 Adapter  在数据加载实现之前阻塞布局行为 ,从而防止失落滚动地位信息。接下来咱们会介绍如何应用这个新的 API,以及它的工作原理。

复原至原有滚动地位

有好几种办法能够用来复原 RecyclerView 至正确的滚动地位,您可能曾经在理论我的项目中用到了这些办法。其中最好的一种办法是将数据提前缓存在内存、ViewModel 或 Repository 中,而后确保在第一次布局传入之前,将缓存的数据设置到 Adapter 中去。如果依据您的我的项目理论状况无奈采纳这种办法,那也能够应用其余的办法,只是要么比较复杂 (比方防止在 RecyclerView 中设置 Adapter,但这样又有可能导致像 header 等 item 的显示问题),要么会导致 LayoutManager.onRestoreInstanceState) API 被滥用。

recyclerview:1.2.0-alpha02 版本中提供的解决方案是引入一个新的 Adapter 办法,来容许您设置它的状态复原策略 (通过枚举类型 StateRestorationPolicy)。它有三个选项:

  • ALLOW — 默认状态,会在下一次布局实现时立刻复原 RecyclerView 状态;
  • PREVENT_WHEN_EMPTY — 仅当 adapter 不为空 (即 adapter.getItemCount() > 0) 的时候,才复原 RecyclerView 的状态。如果您是异步加载数据,RecyclerView 会期待数据加载结束之后,才对状态进行复原。如果在 Adapter 中有一些默认的 item,比方 header 或是 load progress indicator,那您应该应用 PREVENT 选项,除非是通过 ConcatAdapter 增加默认的 item,理解更多详细信息,请查阅《应用 ConcatAdapter 程序连贯其余 Adapter》。ConcatAdapter 会期待所有的 adapter 全副准备就绪后,才进行状态的复原;
  • PREVENT — 所有的状态复原都会等到您设置了 ALLOW 或者 PREVENT_WHEN_EMPTY 选项,才会失去执行。

通过如下示例代码可设置 adapter 的状态复原策略:

adapter.stateRestorationPolicy = PREVENT_WHEN_EMPTY

通过这篇短小精悍的文章您能够理解到对于 RecyclerView 的提早状态复原 (lazy state restoration) 性能。赶快开始应用吧!

正文完
 0