Очень странно работают SwitchButtons в itemView-ах в recyclerView - переключается не тот Switch, который нажал. ViewModel

Очень странно работают SwitchButtons в itemView-ах в recyclerView - переключается не тот Switch, который нажал; или сначала просто моргает, а на второй раз переключается, причем другой.

При нажатии SwitchButton в itemView в recyclerView, Switch должен менять цифру в переменной объекта (см. код в MainActivity).

ViewHolder:

    public class WordViewHolder extends RecyclerView.ViewHolder {

        private final TextView tvSwedish;
        private final TextView tvNativ;
        private final Switch btnSwitch;

        //...other methods of ViewHolder...

    public void bind(String swedishWord, String nativWord, CompoundButton.OnCheckedChangeListener listener) {

            tvSwedish.setText(swedishWord);
            tvNativ.setText(nativWord);
            btnSwitch.setOnCheckedChangeListener(listener);
        }
    }

Adapter:

    public class WordListAdapter extends ListAdapter<Word, WordViewHolder> {

        private OnToggleChangeListener myListener;

        public interface OnToggleChangeListener {
            void onToggleChange(Word word, boolean isChecked);

            protected WordListAdapter(@NonNull DiffUtil.ItemCallback<Word> diffCallback, OnToggleChangeListener listener) {
    super(diffCallback);
    myListener = listener;
}
        }

        //...other methods of adapter...

        @Override
        public void onBindViewHolder(@NonNull WordViewHolder holder, int position) {
            Word currentWord = getItem(position);

            holder.bind(currentWord.getSwedish(), currentWord.getNativ(), (buttonView, isChecked) -> {
                if (isChecked) {
                    myListener.onToggleChange(currentWord, true);
                    buttonView.setChecked(true);
                } else {
                    myListener.onToggleChange(currentWord, false);
                    buttonView.setChecked(false);
                }
            });

        }
    }

В MainActivity:

    public class MainActivity extends AppCompatActivity implements WordListAdapter.OnToggleChangeListener {
    
    //...methods of onCreate...

@Override
public void onToggleChange(Word word, boolean isChecked) {

    if (isChecked) {
        word.setLevel(200);
    } else {
        word.setLevel(300);
    }
    mWordViewModel.update(word);

}

}

Word.class:

    @Entity(tableName = "word_table")
    public class Word {

        @PrimaryKey(autoGenerate = true)
        @NonNull
        private int id;

        @NonNull
        private String swedish;

        @NonNull
        private String nativ;

        @NonNull
        private int level;

        //...getters setters constructor etc...
    }

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

Автор решения: Crush

Вероятно, что здесь - btnSwitch.setOnCheckedChangeListener(listener); - Вам нужно создать новый листенер CompoundButton.OnCheckedChangeListener и поместить всю логику переключения туда.

→ Ссылка