Некорректная работа SwitchButton в ViewHolder-e itemView в recyclerView. (Room)

295
25 июля 2022, 01:30

Почему-то SwitchButton-ы в item-ах в recyclerView работают некорректно. При переключении - иногда переключается не только тот, который переключаю, но и еще один или несколько, к которым не прикасался. В чем может быть причина в коде, и как исправить? спасибо

В адаптере:

//...
@Override
    public void onBindViewHolder(@NonNull WordViewHolder holder, int position) {
        Word currentWord = getItem(position);
        if (currentWord.getLevel() == 200) {
            holder.btnSwitch.setChecked(true);
            holder.btnSwitch.setText("On");
        } else {
            holder.btnSwitch.setChecked(false);
            holder.btnSwitch.setText("Off");
        }
        holder.tvSwedish.setText(currentWord.getSwedish());
        holder.tvNativ.setText(currentWord.getNativ());
        holder.btnSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
            if (isChecked) {
                myListener.onToggleChange(currentWord, true);
            } else {
                myListener.onToggleChange(currentWord, false);
            }
        });
    }

В MainActivity:

//...
public void onToggleChange(Word word, boolean isChecked) {
        if (isChecked) {
            word.showInPractice(true);
        } else {
            word.showInPractice(false);
        }
        mWordViewModel.update(word);
    }

В классе Word:class:

public class Word {
    @PrimaryKey(autoGenerate = true)
    private int id;
    private String swedish;
    private String nativ;
    private int level;
    //...
    public void showInPractice(boolean isShown) {
        if (isShown) {
            this.level = 200;
        } else {
            this.level = 300;
        }
    }
}

В заполнителе в WordDatabase.class:

private static RoomDatabase.Callback sRoomDatabaseCallback = new RoomDatabase.Callback() {
        @Override
        public void onCreate(@NonNull SupportSQLiteDatabase db) {
            super.onCreate(db);
            
            databaseWriteExecutor.execute(() -> {
                WordDao dao = INSTANCE.wordDao();
                dao.deleteAll();
                Word word = new Word("en vägghylla", "настенная полка", 200);
                dao.insert(word);
                word = new Word("ett sophink", "мусорное ведро", 300);
                dao.insert(word);
                word = new Word("för ett år sedan", "год назад", 300);
                dao.insert(word);
            });
        }
    };
Answer 1

Я решил проблему.

В Адаптере в OnBindViewHolder я добавил, перед установкой позиции кнопки setChecked, вызов пустого слушателя setOnCheckedChangedListener(null), и тогда никакие посторонние кнопки не затрагиваются.

Выглядит код так:

@Override
public void onBindViewHolder(@NonNull WordViewHolder holder, int position) {
    Word currentWord = getItem(position);
    holder.btnSwitch.setOnCheckedChangeListener(null); //вот эту строку добавил.
    if (currentWord.getLevel() == 200) {
        holder.btnSwitch.setChecked(true);
        holder.btnSwitch.setText("On");
    } else {
        holder.btnSwitch.setChecked(false);
        holder.btnSwitch.setText("Off");
    }
    holder.tvSwedish.setText(currentWord.getSwedish());
    holder.tvNativ.setText(currentWord.getNativ());
    holder.btnSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
        if (isChecked) {
            myListener.onToggleChange(currentWord, true);
        } else {
            myListener.onToggleChange(currentWord, false);
        }
    });
}

Возможно есть решение лучше, но это работает.

READ ALSO
BottomNavigationView и Fragment. Как сохранить состояние?

BottomNavigationView и Fragment. Как сохранить состояние?

Есть BottomNavigationView и 3 Fragment'аФрагмент "Home" содержит ScrollView

345
Проблема с итерацией в цикле

Проблема с итерацией в цикле

Есть некоторая коллекция(исходник: Проблема с удалением переменных классов потомков):

373
Динамический выпадающий список с данными из mysql на php

Динамический выпадающий список с данными из mysql на php

Помогите реализовать задачу, иметься таблица в базе данных

406
Зачем на нужны join если есть where?

Зачем на нужны join если есть where?

Учу sql заново, и у меня возник вопрос зачем вообще нужны джоиныОбъеденить таблицы ведь можно с помощью фореина и праймари ключей в таблицах...

307