DiffUtil简要使用
时间: 2023-07-11 13:18:54 浏览: 67
DiffUtil的使用大致可以分为以下几个步骤:
1. 创建一个继承DiffUtil.Callback的回调类,并在其中实现以下方法:
- getOldListSize() 返回旧列表的大小
- getNewListSize() 返回新列表的大小
- areItemsTheSame(int oldItemPosition, int newItemPosition) 比较旧列表中的第oldItemPosition项和新列表中的第newItemPosition项是否代表同一个对象
- areContentsTheSame(int oldItemPosition, int newItemPosition) 比较旧列表中的第oldItemPosition项和新列表中的第newItemPosition项的内容是否相同
- getChangePayload(int oldItemPosition, int newItemPosition) 如果areContentsTheSame()返回false,则在这个方法中获取新旧列表中的第oldItemPosition项和第newItemPosition项之间的差异,并返回一个Object类型的变量
2. 在Adapter中调用DiffUtil.calculateDiff()方法,传入回调类和一个Boolean类型的参数,用于指定是否在后台线程中计算差异。
3. 将DiffUtil.DiffResult对象应用到Adapter中,通常是通过调用Adapter的notifyDataSetChanged()、notifyItemRangeInserted()、notifyItemRangeRemoved()等方法进行应用。
下面是一个简单的示例代码:
```
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
private List<MyModel> mOldList;
private List<MyModel> mNewList;
// 构造方法和 onCreateViewHolder() 等方法省略
public void updateList(List<MyModel> newList) {
mOldList = mNewList;
mNewList = newList;
DiffUtil.Callback callback = new MyDiffCallback(mOldList, mNewList);
DiffUtil.DiffResult result = DiffUtil.calculateDiff(callback);
result.dispatchUpdatesTo(this);
}
private static class MyDiffCallback extends DiffUtil.Callback {
private List<MyModel> mOldList;
private List<MyModel> mNewList;
public MyDiffCallback(List<MyModel> oldList, List<MyModel> newList) {
mOldList = oldList;
mNewList = newList;
}
@Override
public int getOldListSize() {
return mOldList.size();
}
@Override
public int getNewListSize() {
return mNewList.size();
}
@Override
public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
return mOldList.get(oldItemPosition).getId() == mNewList.get(newItemPosition).getId();
}
@Override
public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
MyModel oldModel = mOldList.get(oldItemPosition);
MyModel newModel = mNewList.get(newItemPosition);
return oldModel.getName().equals(newModel.getName())
&& oldModel.getAge() == newModel.getAge();
}
@Nullable
@Override
public Object getChangePayload(int oldItemPosition, int newItemPosition) {
MyModel oldModel = mOldList.get(oldItemPosition);
MyModel newModel = mNewList.get(newItemPosition);
Bundle diffBundle = new Bundle();
if (!oldModel.getName().equals(newModel.getName())) {
diffBundle.putString("name", newModel.getName());
}
if (oldModel.getAge() != newModel.getAge()) {
diffBundle.putInt("age", newModel.getAge());
}
if (diffBundle.size() == 0) {
return null;
}
return diffBundle;
}
}
}
```
在上述代码中,我们将新旧列表保存在了MyAdapter中,并提供了一个updateList()方法用于更新列表。在updateList()方法中,我们使用MyDiffCallback类实现了DiffUtil.Callback接口,并将它传入DiffUtil.calculateDiff()方法中进行差异计算。最后,我们将DiffUtil.DiffResult对象应用到Adapter中,通常是通过调用Adapter的notifyDataSetChanged()、notifyItemRangeInserted()、notifyItemRangeRemoved()等方法进行应用。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)