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

Change in LiveData to update RecyclerView. Correct methodology?

我有一个 "simple" 推荐框架的例子 Android/Room/LiveData。

外观如下:

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

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

我怎样才能在不导致回收器 "re-draw" 的情况下更新 RecyclerView。 IE。我不想创建一个 new Adapter(); 并将其应用到 RecyclerView...而只是更新适配器中已有的数据并更改回收器视图中的某些字段而不影响用户体验。

谢谢!

这里可以帮助您的工具是 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