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));
}
}