Я реализовал Java-приложение для Android с шаблоном MVVM с Room, ViewModel, LiveData, Recylerview.
- В recyclerview есть список элементов, и в каждом элементе есть флажок.
- Когда флажок в элементе recyclerview включен или отключен, модель обновляется в базе данных комнаты через ViewModel.
- Чтобы прослушивать событие включения или отключения флажка для каждого элемента recyclerview, я реализовал OnCheckedChangeListener.
Это нормально с recyclerview с 1 или 2 предметами,
Но когда количество элементов recyclerview увеличивается, например> 10, при включении или отключении флажка другие элементы в recyclerview также страдают.
Например:
Если я изменяю флажок в элементе [5] (идентификатор элемента равен 21, флажок включен), он также запускает OnCheckedChangeListener для других элементов, таких как элемент [1] (идентификатор элемента равен 15, флажок включен) и элемент [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);
, проблема устранилась, но это не рекомендуется, мне нужно найти другой механизм, чтобы избежать этого.