问题描述
RecyclerView 的实现通常有以下方法:
- 创建 RecyclerAdapter 保存数据集或对它的引用,例如列表
- 将适配器和 LayoutManager 附加到 RecyclerView
- 在适配器上调用 setItems(或等效项)以刷新内容
- 可选添加分页+无限滚动,以便能够一次逐渐加载更多内容小缝隙
这利用了 RecyclerView 和 ViewHolder 的强大功能来高效地显示庞大的数据集。但是,它并没有解决将数据集存储在内存中的问题,这正是我的问题所在。
想象一下,我的数据集中有 100 万个项目,并且实现了分页 + 无限滚动。如果我在最后一页,为了让 RecyclerView 能够显示项目,我们必须将所有 100 万个项目存储在适配器的列表中,并使用该列表和相关的 RecyclerAdapter 方法。
有没有更有效的方法来做到这一点?我最初的想法是采用某种基于滑动窗口的方法,我们将在内存中保留固定数量的页面,并有一个双向无限滚动实现,其中下一页/上一页窗口随着滚动“视口”的变化而更新当用户滚动时。不确定这是否会影响滚动性能...
解决方法
它的工作原理是将数据作为页面加载,而不仅仅是将所有内容加载到内存中。滚动时,它会加载您告诉它的适当页面,因此它不必将所有内容都保留在内存中,您可以传递适当的键来检索数据的位置,分页库将为您处理。>
它支持从数据库读取以及从网络读取或两者的混合,因此无论您需要什么都可以
我想值得一提的是,如果您已经有自己的实现,您也可以尝试模仿这种行为。如果您有办法知道用户在您显示的数据中达到了某个阈值,您可以自己加载下一页/上一页,然后自己管理您在内存中保留的数据量。向上/向下一页可能就足够了,您可以清除自己的本地内存