ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

恢复 RecyclerView 的滚动位置

2020-12-14 19:32:23  阅读:216  来源: 互联网

标签:PREVENT 滚动 恢复 Adapter 位置 RecyclerView adapter


您可能在开发过程中遇到过这种情况,在 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) 功能。赶快开始使用吧!

来源:网络营销重要吗?

标签:PREVENT,滚动,恢复,Adapter,位置,RecyclerView,adapter
来源: https://www.cnblogs.com/0591jb/p/14135182.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有