【问题标题】:Strategies for displaying large dataset in Android RecyclerViewAndroid RecyclerView中显示大数据集的策略
【发布时间】:2021-02-28 12:20:35
【问题描述】:

RecyclerView 的实现通常有以下方法:

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

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

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

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

【问题讨论】:

    标签: android performance android-recyclerview memory-efficient


    【解决方案1】:

    考虑android's paging library

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

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


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

    【讨论】:

    • 哈!我不知道那个图书馆,似乎它就是为了做到这一点。甚至支持预加载视图页面。在将答案标记为正确之前会稍等片刻以查看其他建议。谢谢
    • 我不确定这个库的状态是什么,但我用过两次,第一次有点乱,但版本 3(目前处于 alpha 阶段)要简单得多,所以也许可以尝试一下,因为它的价值
    • 不管怎样,很高兴这能有所帮助
    • 当然值得一试,文档中的设置看起来很简单 ?
    • 据我记得,“标准”分页库有点复杂,有 3 种不同类型的 DataSource 工厂要创建(或类似的东西),我发现它有点混乱,但是Paging 3 取消了这一点,让您自己处理,但这完全是我自己的观点,我可以确认该库确实运行良好,但我之前已经看过并使用过它
    猜你喜欢
    • 2020-08-07
    • 2020-04-08
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2017-04-15
    • 2011-03-23
    相关资源
    最近更新 更多