在 Android RecyclerView 中显示大型数据集的策略

问题描述

RecyclerView 的实现通常有以下方法

  • 创建 RecyclerAdapter 保存数据集或对它的引用,例如列表
  • 将适配器和 LayoutManager 附加到 RecyclerView
  • 在适配器上调用 setItems(或等效项)以刷新内容
  • 可选添加分页+无限滚动,以便能够一次逐渐加载更多内容小缝隙

这利用了 RecyclerView 和 ViewHolder 的强大功能来高效地显示庞大的数据集。但是,它并没有解决将数据集存储在内存中的问题,这正是我的问题所在。

想象一下,我的数据集中有 100 万个项目,并且实现了分页 + 无限滚动。如果我在最后一页,为了让 RecyclerView 能够显示项目,我们必须将所有 100 万个项目存储在适配器的列表中,并使用该列表和相关的 RecyclerAdapter 方法

有没有更有效的方法来做到这一点?我最初的想法是采用某种基于滑动窗口的方法,我们将在内存中保留固定数量页面,并有一个双向无限滚动实现,其中下一页/上一页窗口随着滚动“视口”的变化而更新当用户滚动时。不确定这是否会影响滚动性能...

解决方法

考虑android's paging library

它的工作原理是将数据作为页面加载,而不仅仅是将所有内容加载到内存中。滚动时,它会加载您告诉它的适当页面,因此它不必将所有内容都保留在内存中,您可以传递适当的键来检索数据的位置,分页库将为您处理。>

它支持从数据库读取以及从网络读取或两者的混合,因此无论您需要什么都可以


我想值得一提的是,如果您已经有自己的实现,您也可以尝试模仿这种行为。如果您有办法知道用户在您显示的数据中达到了某个阈值,您可以自己加载下一页/上一页,然后自己管理您在内存中保留的数据量。向上/向下一页可能就足够了,您可以清除自己的本地内存

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...