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