我使用Room、ViewModel、LiveData和Recyclerview实现了一个MVVM模式的Android Java应用程序。
- Recyclerview中有一个项目列表,并且每个项目中都有一个复选框。
- 当启用或禁用Recyclerview项中的复选框时,通过ViewModel更新Room数据库中的模型。
- 为了监听每个Recyclerview项上的复选框启用或禁用事件,我已经实现了一个OnCheckedChangeListener。
对于只有1或2个项目的Recyclerview,一切正常,
但是当Recyclerview项目增加到超过10个项目时,例如>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);
});
}
}
我需要解决Recyclerview回收问题的解决方案。
注意:
我已经尝试了this.setIsRecyclable(false);
,它解决了这个问题,但不推荐使用,我需要找到另一种机制来避免这种情况发生。