Почему-то 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);
});
}
};
Я решил проблему.
В Адаптере в 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);
}
});
}
Возможно есть решение лучше, но это работает.
Есть BottomNavigationView и 3 Fragment'аФрагмент "Home" содержит ScrollView
Есть некоторая коллекция(исходник: Проблема с удалением переменных классов потомков):
Помогите реализовать задачу, иметься таблица в базе данных
Учу sql заново, и у меня возник вопрос зачем вообще нужны джоиныОбъеденить таблицы ведь можно с помощью фореина и праймари ключей в таблицах...