Java (android)我可以在DiffUtill实现中使用此代码吗?

Java (android)我可以在DiffUtill实现中使用此代码吗?,java,android,android-diffutils,Java,Android,Android Diffutils,我现在制作了一个DiffUtil类,只更新RecyclerView中更改的项目 我已经看到了其他几个示例代码 当比较两个对象时,它们会比较唯一的值​​例如在areItemsTheSame()中的模型(数据)类中定义的id 但是,我认为很难为列表分配id或唯一值,或者代码很乱 我必须这样定义和比较id吗 我真的需要在模型类中定义一个唯一的Id变量来分隔每个对象吗? 或者我不应该简单地使用equals() 使用它不仅可以比较对象的地址,还可以比较对象的内容吗 作为补充问题 DiffUtil.Call

我现在制作了一个
DiffUtil
类,只更新
RecyclerView
中更改的项目

我已经看到了其他几个示例代码

当比较两个对象时,它们会比较唯一的值​​例如在
areItemsTheSame()
中的
模型(数据)
类中定义的id

但是,我认为很难为列表分配
id
唯一值
,或者代码很乱

我必须这样定义和比较
id

我真的需要在
模型类
中定义一个唯一的Id变量来分隔每个对象吗? 或者我不应该简单地使用
equals()

使用它不仅可以比较对象的地址,还可以比较对象的内容吗

作为补充问题

DiffUtil.CallBack
DiffUtil.ItemCallBack
之间有什么区别

这是我的密码

RoutineModel.java

公共类RoutineModel{
私有ArrayList RoutineDetail模型;
私有字符串例程;
公共RoutineModel(ArrayList项、字符串例程){
这个。例行程序=例行程序;
this.routineDetailModels=项目;
}
公共ArrayList getDetailItemList(){
返回RoutineDetail模型;
}
public int getDetailItemSize(){
返回routineDetailModels.size();
}
公共字符串getRoutine(){
返回程序;
}
公共无效设置例程(字符串例程){
这个。例行程序=例行程序;
}
}
routinefifutil.java

公共类RoutineDiffUtil扩展了DiffUtil.Callback{
私人最终名单;
私人最终名单;
公共RoutineDiffUtil(ArrayList oldRoutineList,ArrayList newRoutineList){
this.oldRoutineList=oldRoutineList;
this.newRoutineList=newRoutineList;
}
@凌驾
public int getOldListSize(){
返回oldRoutinList.size();
}
@凌驾
public int getNewListSize(){
返回newRoutinList.size();
}
@凌驾
公共布尔值areItemsTheSame(int-oldItemPosition,int-newItemPosition){
返回oldRoutineList.equals(newRoutineList);
}
@凌驾
公共布尔值是相同的内容(int oldItemPosition,int newItemPosition){
返回oldRoutineList.equals(newRoutineList);
}
}

您错误理解了
areItemsTheSame()
areContentsTheSame()
回调的含义。如您所见,其中有
oldItemPosition
newItemPosition
参数。您应该使用它们来比较特定的项目,而不是列表本身

areItemsTheSame()
中,您必须检查旧列表中位于“旧”位置的模型是否等于新列表中位于“新”位置的模型。这就是DiffUtil知道是否必须对动画进行重新排序的方式

areContentsTheSame()
将为两个项目调用,当且仅当您在上一次回调中为它们返回
true
。在这里,您必须检查“旧”和“新”模型的视觉表示是否相同。这就是DiffUtil知道是否必须制作“项目更改”动画的方式

要比较两个模型,必须覆盖
equals()
hashCode()
。在这里,您指定了两个模型相同的条件。例如,如果它们具有相同的
例程
。我不知道任务的上下文,所以我不能确切地告诉您如何实现它们,但通常您只是比较所有字段。可能添加
id
字段也是一个好主意。然后,如果它们具有相同的<代码> ID <代码>,可以考虑“相等”的模型。在
hashCode()
中,您只需返回
对象。hash(id)

现在,谈谈你关于
ItemCallback
的问题。正式地说,以下是文档中的解释:

Callback提供两个角色-列表索引和项差异。ItemCallback只处理其中的第二个,它允许将索引到数组或列表的代码与表示层和特定于内容的差异化代码分离


实际上,
ItemCallback
实现的方法较少,并且与之一起使用。这只是因为缺少的方法已经在AsyncListDifferent中实现了。

您错误理解了
areItemsTheSame()
areContentsTheSame()
回调的含义。如您所见,其中有
oldItemPosition
newItemPosition
参数。您应该使用它们来比较特定的项目,而不是列表本身

areItemsTheSame()
中,您必须检查旧列表中位于“旧”位置的模型是否等于新列表中位于“新”位置的模型。这就是DiffUtil知道是否必须对动画进行重新排序的方式

areContentsTheSame()
将为两个项目调用,当且仅当您在上一次回调中为它们返回
true
。在这里,您必须检查“旧”和“新”模型的视觉表示是否相同。这就是DiffUtil知道是否必须制作“项目更改”动画的方式

要比较两个模型,必须覆盖
equals()
hashCode()
。在这里,您指定了两个模型相同的条件。例如,如果它们具有相同的
例程
。我不知道任务的上下文,所以我不能确切地告诉您如何实现它们,但通常您只是比较所有字段。可能添加
id
字段也是一个好主意。然后,如果它们具有相同的<代码> ID <代码>,可以考虑“相等”的模型。在
hashCode()
中,您只需返回
对象。hash(id)

现在,谈谈你关于public class RoutineModel { private ArrayList<RoutineDetailModel> routineDetailModels; private String routine; public RoutineModel(ArrayList<RoutineDetailModel> items, String routine) { this.routine = routine; this.routineDetailModels = items; } public ArrayList<RoutineDetailModel> getDetailItemList() { return routineDetailModels; } public int getDetailItemSize() { return routineDetailModels.size(); } public String getRoutine() { return routine; } public void setRoutine(String routine) { this.routine = routine; } }
public class RoutineDiffUtil extends DiffUtil.Callback {
    private final List<RoutineModel> oldRoutineList;
    private final List<RoutineModel> newRoutineList;

    public RoutineDiffUtil(ArrayList<RoutineModel> oldRoutineList, ArrayList<RoutineModel> newRoutineList) {
        this.oldRoutineList = oldRoutineList;
        this.newRoutineList = newRoutineList;
    }

    @Override
    public int getOldListSize() {
        return oldRoutineList.size();
    }

    @Override
    public int getNewListSize() {
        return newRoutineList.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return oldRoutineList.equals(newRoutineList);
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return oldRoutineList.equals(newRoutineList);
    }
}
class RoutineModel {
    private ArrayList<RoutineDetailModel> routineDetailModels;
    private String            routine;

    public RoutineModel(ArrayList<RoutineDetailModel> items, String routine) {
        this.routine = routine;
        this.routineDetailModels = items;
    }

    public ArrayList<RoutineDetailModel> getDetailItemList() {
        return routineDetailModels;
    }

    public int getDetailItemSize() {
        return routineDetailModels.size();
    }

    public String getRoutine() {
        return routine;
    }

    public void setRoutine(String routine) {
        this.routine = routine;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        RoutineModel that = (RoutineModel) o;
        return Objects.equals(routineDetailModels, that.routineDetailModels) &&
            Objects.equals(routine, that.routine);
    }

    @Override
    public int hashCode() {
        return Objects.hash(routineDetailModels, routine);
    }
}
public class RoutineDiffUtil extends DiffUtil.Callback {
    private final List<RoutineModel> oldRoutineList;
    private final List<RoutineModel> newRoutineList;

    public RoutineDiffUtil(ArrayList<RoutineModel> oldRoutineList, ArrayList<RoutineModel> newRoutineList) {
        this.oldRoutineList = oldRoutineList;
        this.newRoutineList = newRoutineList;
    }

    @Override
    public int getOldListSize() {
        return oldRoutineList.size();
    }

    @Override
    public int getNewListSize() {
        return newRoutineList.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return oldRoutineList.get(oldItemPosition).getRoutine().equals(newRoutineList.get(newItemPosition).getRoutine());
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return oldRoutineList.get(oldItemPosition).equals(newRoutineList.get(newItemPosition));
    }
}