如何使用 DiffUtil 一次更改项目的数据?

问题描述

enter image description here

当我按下 toggle button 时,我想立即更改当前显示的回收站视图列表的单位。

我使用 listadapter + DiffUtil显示 recycler view

我尝试实现此功能方法是在按下切换按钮时加载当前列表。

然后,在为当前列表重置新的切换单位值后,我使用 submitList() 更新列表。

但这是错误的方式。

我的猜测是因为为待更新加载的列表的值创建的变量具有相同的引用值,因此该值同时发生了变化。

也就是说,没有变化,因为更新列表和现有列表的值是一样的。

我该怎么做才能解决这个问题?

RoutineDetailModel.java

public class RoutineDetailModel {
    public int id;
    private int set = 1;
    public static String unit = "kg";

    public RoutineDetailModel() {
        Random random = new Random();
        this.id = random.nextInt();
    }

    public RoutineDetailModel(int set) {
        Random random = new Random();
        this.id = random.nextInt();
        this.set = set+1;
    }

    public int getSet() {
        return set;
    }

    public int getId() {
        return id;
    }

    public String getWeight() {
        return weight;
    }

    public String getUnit() {
        return unit;
    }

    @Override
    public int hashCode() {
        return Objects.hash(set,weight); // getWeight를 호출하면 더 다양하게 되나?
    }

    @Override
    public boolean equals(@Nullable Object obj) {
        if(obj != null && obj instanceof RoutineDetailModel) {
            RoutineDetailModel model = (RoutineDetailModel) obj;
            if(this.id == model.getId()) {
                return true;
            }
        }
        return false;
    }
}

MainActivity.java

public class WriteRoutineActivity extends AppCompatActivity implements WritingCommentDialogFragment.OnDialogClosedListener {
    List<RoutineModel> items;
    Routinelistadapter listadapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_write_routine);
        
        listadapter.setonRoutineClickListener(new Routinelistadapter.OnRoutineItemClickListener() {
            @Override
            public void onUnitBtnClicked(int curRoutinePos,String unit) {
                Object obj = listadapter.getRoutineItem(curRoutinePos);
                RoutineModel item = (RoutineModel) obj;
                if(obj instanceof RoutineModel) {
                    for(RoutineDetailModel detailItem : item.getDetailItemList()) {
                        detailItem.setUnit(unit);
                    }
                    listadapter.submitList(getUpdatedList());
                }
            }
        });
    }
}

如果您需要更多信息,请告诉我

解决方法

要更改所有项目,您需要使用 notifyDataSetChanged() 否则您无法更新所有项目。

为此,您必须在适配器内创建一个方法,该方法执行以下操作 ->

public void updateItems(String unit) {
    for({YOUR ITEM TYPE} item: {YOUR LIST}) {
       item.unit = unit;
    }
    
    notifyDataSetChanged();
}

当你想改变所有单位时调用这个方法。

 yourAdapter.updateItems("Kg");