更改LiveData以更新RecyclerView。正确的方法?

时间:2018-08-16 11:16:13

标签: android android-recyclerview android-room android-livedata

我有一个推荐的Android / Room / LiveData框架的“简单”示例。

外观如下:enter image description here

我通过活动中的观察者成功获取了LiveData更新。 数据以List<Reader>的形式返回。每个“阅读器”都有一个唯一的字段,称为String token。 然后,观察者获取List<Reader>并将其添加到新的Adapter中,然后将其应用于RecyclerView。

所以...这将导致RecyclerView更新的问题并导致UI发生较大变化(例如,滚动回顶部)。 我可能有一些导致模型发生某些更改的后台进程,并且不想完全重画RecyclerView ...而只是用新的LiveData更新适用的视图。

然后如何在不导致回收站“重新绘制”的情况下更新RecyclerView。即我不想创建一个new Adapter();并将其应用于RecyclerView ...而是只更新适配器中已有的数据并更改回收器中视图中的某些字段而不会影响用户的体验。

谢谢!

1 个答案:

答案 0 :(得分:0)

DiffUtil是帮助您的工具。 DiffUtil提取新数据并将其与recyclerview已有的数据进行比较。然后,它仅更新已更改或移动的特定项目。

使用diffutil,您需要实现2种方法来告知recyclerview数据是否已更改:

@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
    return mOldEmployeeList.get(oldItemPosition).getId() == mNewEmployeeList.get(
            newItemPosition).getId();
}

@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
    final Employee oldEmployee = mOldEmployeeList.get(oldItemPosition);
    final Employee newEmployee = mNewEmployeeList.get(newItemPosition);

    return oldEmployee.getName().equals(newEmployee.getName());
}

您可以在这里参考:https://developer.android.com/reference/android/support/v7/util/DiffUtil