Очень странно работают 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 и поместить всю логику переключения туда.