gpt4 book ai didi

android - 在 Recylerview 中实现复选框。 MVVM Room ViewModel LiveData Recylerview 复选框

转载 作者:行者123 更新时间:2023-11-29 16:30:47 25 4
gpt4 key购买 nike

我已经使用 Room、ViewModel、LiveData、Recylerview 实现了一个 MVVM 模式的 android java 应用程序。

  1. recyclerview 有一个项目列表,每个项目中都有一个复选框。
  2. 当启用或禁用 recyclerview 项目的复选框时,模型通过 ViewModel 在房间数据库中更新。
  3. 在每个 recyclerview 上监听复选框启用或禁用事件项目,我已经实现了 OnCheckedChangeListener。

有 1 或 2 个项目的 recyclerview 没问题,

但是当 recyclerview 项目增加时,比如 >10 个项目,当我启用或禁用复选框时,recyclerview 中的其他项目也会受到影响。

例如:

如果我更改项目 [5] 处的复选框(项目 ID 为 21,启用复选框),它还会为其他项目触发 OnCheckedChangeListener,例如项目 [1](项目 ID 为 15,启用复选框)和项目 [8](项目 ID 为 18,启用复选框)。

日志:

2019-04-25 11:15:33.343 9890-9890/com.hardian.mvvm.sample D/RVAdapter: setOnCheckedChange--- ID :21 isRetryEnabled; false isChecked true
2019-04-25 11:15:33.405 9890-9890/com.hardian.mvvm.sample D/RVAdapter: setOnCheckedChange--- ID :15 isRetryEnabled; false isChecked true
2019-04-25 11:15:33.415 9890-9890/com.hardian.mvvm.sample D/RVAdapter: setOnCheckedChange--- ID :18 isRetryEnabled; false isChecked true

代码:在我的 StatusRecyclerViewAdapter 中

 @Override
public void onBindViewHolder(StatusViewHolder holder, int position) {
StatusItem statusItem = mDataSet.get(position);

if (statusItem != null) {
cbStatus.setChecked(statusItem.isRetryEnabled());

cbStatus.setOnCheckedChangeListener((buttonView, isChecked) -> {
Log.d("RVAdapter", "setOnCheckedChange--- ID :" + statusItem.getId()+ " isRetryEnabled; "+statusItem.isRetryEnabled()+" isChecked "+isChecked);
//update the model via the activitiy's viewmodel through the onStatusCheckBoxChangeListener interface.
if (onStatusCheckBoxChangeListener != null)
onStatusCheckBoxChangeListener.onStatusCheckBoxChanged(statusItem,isChecked);
});

}
}

我需要一个解决方案来解决 Recylerview 回收的这个问题。

注意:我试过this.setIsRecyclable(false);,它解决了这个问题,但不推荐,我需要找到另一种机制来避免这种情况。

最佳答案

  1. 将标签设置为您的复选框并从标签中获取项目。
  2. 不要使用 setOnCheckedChangeListener,而是使用 setOnClickListener。

代码:

cbStatus.setTag(statusItem);
cbStatus.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
StatusItem item = (StatusItem) cb.getTag();
if (onStatusCheckBoxChangeListener != null)
onStatusCheckBoxChangeListener.onStatusCheckBoxChanged(item,cb.isChecked());
}
});

关于android - 在 Recylerview 中实现复选框。 MVVM Room ViewModel LiveData Recylerview 复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55852816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com