【发布时间】:2019-04-25 15:27:30
【问题描述】:
我已经用 Room、ViewModel、LiveData、Recylerview 实现了一个 MVVM 模式的 android java 应用程序。
- recyclerview 有一个项目列表,每个项目都有一个复选框。
- 当 recyclerview 项目的复选框被启用或禁用时, 模型通过 ViewModel 在房间数据库中更新。
- 在每个recyclerview上监听复选框启用或禁用事件 项目,我已经实现了一个 OnCheckedChangeListener。
recyclerview 可以有 1 或 2 个项目,
但是当 recyclerview 项目增加时,比如 >10 个项目,当我启用或禁用该复选框时,recyclerview 中的其他项目也会受到影响。
例如:
如果我更改 item[5] 处的复选框(项目 ID 为 21,复选框启用), 它还为其他项目触发 OnCheckedChangeListener,如 item[1](项目 ID 为 15,启用复选框)和 item[8](项目 ID 为 18,启用复选框)。
Logcat:
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);,它解决了这个问题,但不推荐,我需要找到另一种机制来避免这种情况。
【问题讨论】:
标签: android android-recyclerview android-room android-viewmodel