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

Почему-то 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);
            });
        }
    };

Ответы (1 шт):

Автор решения: Alex Rodionow

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

В Адаптере в 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);
        }
    });
}

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

→ Ссылка