将DiffResult分发到RecyclerView Adapter之后,到底发生了什么?

时间:2019-04-12 11:20:45

标签: android android-recyclerview

我正在浏览RecyclerView的DiffUtil docs

除了一件事情,我了解大多数部分。它说在计算差异后,您可以执行以下操作:

List oldList = mAdapter.getData();
DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldList, newList));
mAdapter.setData(newList);
result.dispatchUpdatesTo(mAdapter);

并说:

  

您可以将列表替换为新列表,然后将所有更新分发到RecyclerView。

我在这里有疑问。这到底是怎么回事?

如果我已经向适配器分派了更新,那么使用这些更新后,它不会自动到达新数据吗?为什么我需要显式设置新数据?

高度赞赏地解释了这些更新如何由Adpater分发和使用的答案。

谢谢。

1 个答案:

答案 0 :(得分:0)

方法dispatchUpdatesTo(RecyclerView.Adapter)实际上是dispatchUpdatesTo(ListUpdateCallback updateCallback)的简单包装。

我认为source code是自我解释:

public void dispatchUpdatesTo(final RecyclerView.Adapter adapter) {
      dispatchUpdatesTo(new ListUpdateCallback() {
          @Override
          public void onInserted(int position, int count) {
              adapter.notifyItemRangeInserted(position, count);
          }
          @Override
          public void onRemoved(int position, int count) {
              adapter.notifyItemRangeRemoved(position, count);
          }
          @Override
          public void onMoved(int fromPosition, int toPosition) {
              adapter.notifyItemMoved(fromPosition, toPosition);
          }
          @Override
          public void onChanged(int position, int count, Object payload) {
              adapter.notifyItemRangeChanged(position, count, payload);
          }
      });
}

您可以看到回调的唯一目的是通知更新。

计算差异是只读操作,不会更改两个列表。因此,您需要在适配器内部手动更新列表。