如何使用 DiffUtil 一次更改项目的数据?
How to change the data of an item at once using DiffUtil?
当我按下 toggle button
时,我想立即更改当前显示的回收站视图列表的单位。
我用了ListAdapter
+ DiffUtil
来显示recycler view
。
我尝试实现此功能的方法是在按下切换按钮时加载当前列表。
然后,在为当前列表重置新的切换单位值后,我使用submitList()
更新列表。
但这是错误的方法。
我的猜测是因为为要更新的列表加载的值创建的变量具有相同的引用值,所以值同时发生变化。
也就是说没有变化,因为update list和existing list的值是一样的
我该怎么做才能解决这个问题?
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");
当我按下 toggle button
时,我想立即更改当前显示的回收站视图列表的单位。
我用了ListAdapter
+ DiffUtil
来显示recycler view
。
我尝试实现此功能的方法是在按下切换按钮时加载当前列表。
然后,在为当前列表重置新的切换单位值后,我使用submitList()
更新列表。
但这是错误的方法。
我的猜测是因为为要更新的列表加载的值创建的变量具有相同的引用值,所以值同时发生变化。
也就是说没有变化,因为update list和existing list的值是一样的
我该怎么做才能解决这个问题?
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");