我正在浏览RecyclerView的DiffUtil docs。
除了一件事情,我了解大多数部分。它说在计算差异后,您可以执行以下操作:
List oldList = mAdapter.getData();
DiffResult result = DiffUtil.calculateDiff(new MyCallback(oldList, newList));
mAdapter.setData(newList);
result.dispatchUpdatesTo(mAdapter);
并说:
您可以将列表替换为新列表,然后将所有更新分发到RecyclerView。
我在这里有疑问。这到底是怎么回事?
如果我已经向适配器分派了更新,那么使用这些更新后,它不会自动到达新数据吗?为什么我需要显式设置新数据?
高度赞赏地解释了这些更新如何由Adpater分发和使用的答案。
谢谢。
答案 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);
}
});
}
您可以看到回调的唯一目的是通知更新。
计算差异是只读操作,不会更改两个列表。因此,您需要在适配器内部手动更新列表。