我已经使用 Room、ViewModel、LiveData、Recylerview 实现了一个 MVVM 模式的 android java 应用程序。
- recyclerview 有一个项目列表,每个项目中都有一个复选框。
- 当启用或禁用 recyclerview 项目的复选框时, 模型通过 ViewModel 在房间数据库中更新。
- 在每个 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);
,它解决了这个问题,但不推荐,我需要找到另一种机制来避免这种情况。
最佳答案
- 将标签设置为您的复选框并从标签中获取项目。
- 不要使用 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/