美文网首页
RecyclerView(4) - 引入DiffUtil 优化更

RecyclerView(4) - 引入DiffUtil 优化更

作者: 行走中的3卡 | 来源:发表于2022-12-05 09:52 被阅读0次

    ecyclerView(4) - 引入DiffUtil 优化更新

    1. 学习内容

    (1)使用 DiffUtil, 这个实用程序来计算两个列表之间的差异
    以便 高效更新 RecyclerView 显示的列表。
    (2)将数据绑定与 RecyclerView 结合使用
    (3)使用 绑定适配器(BindingAdapter)转换数据

    2. 实践内容

    更新 SleepNightAdapter,以便使用 DiffUtil 高效地更新列表
    使用 绑定适配器 转换数据,从而为 RecyclerView 实现数据绑定

    3. 现有代码

    https://github.com/google-developer-training/android-kotlin-fundamentals-starter-apps/tree/master/RecyclerViewDiffUtilDataBinding-Starter

    RecyclerView 与适配器模式结合使用,以向用户显示睡眠数据。
    <应用结构图>:


    睡眠质量样例结构图.PNG

    分析:
    (1)应用根据用户输入创建 SleepNight 对象列表。
    每个 SleepNight 对象表示 一个夜晚以及用户该晚 睡眠的时长和质量
    (2)SleepNightAdapter 会将 SleepNight 对象的列表
    调整为 RecyclerView 可以使用和显示的内容。
    (3)SleepNightAdapter 适配器会生成 ViewHolders,
    其中包含 RecyclerView 用于显示数据的视图、数据和元数据信息
    (4)RecyclerView 使用 SleepNightAdapter 来确定要显示的 项数 (getItemCount())。
    RecyclerView 使用 onCreateViewHolder()和 onBindViewHolder() 获取与要显示的数据绑定的 ViewHolder。

    4. 存在问题: notifyDataSetChanged() 方法效率低下.

    为了告知 RecyclerView 列表中的某个项已更改且需要更新,
    当前代码会在 SleepNightAdapter 中调用 notifyDataSetChanged(),如下所示

    var data =  listOf<SleepNight>()
       set(value) {
           field = value
           notifyDataSetChanged()
       }
    

    但是,notifyDataSetChanged() 会告知 RecyclerView 整个列表可能无效。
    因此,RecyclerView 会重新绑定重新绘制列表中的每个项,包括屏幕上看不到的项。
    这是一项既繁重又不必要的工作。
    对于较大或复杂的列表,这个过程可能需要较长时间
    以至于在用户 滚动浏览列表时,屏幕会闪烁或卡顿

    4.1 DiffUtil 很高效并可为完成繁重工作

    RecyclerView 有一个名为 DiffUtil 的类,用于计算两个列表之间的差异

    4.1.1 DiffUtil 简介

    DiffUtil 会接受一个旧列表和一个新列表,并确定二者有何不同。

    过程:
    (1)查找已添加、移除或更改的项。
    (2)使用一种算法(名为 Eugene W. Myers 差分算法),
    来确定要生成新列表,需要对旧列表做出的最小更改量
    (3)在 DiffUtil 确定了更改内容后,
    RecyclerView 可以根据这些信息仅更新已更改、添加、移除或移动的项,
    这比重做整个列表高效得多。

    参考文献:
    https://developer.android.com/codelabs/kotlin-android-training-diffutil-databinding?hl=zh-cn#2

    相关文章

      网友评论

          本文标题:RecyclerView(4) - 引入DiffUtil 优化更

          本文链接:https://www.haomeiwen.com/subject/sveefdtx.html