switchButton isChecked(true/false) внутри itemView of recycleView. Room. Как создать условие а адаптере?

363
18 июля 2022, 21:50

Подскажите плиз, как сделать чтобы в зависимости от значения level в объекте Word в базе, switchButton внутри соответствующего itemView при загрузке активити заранее становился checked (в случае 200) или выключен (в случае 300)?

В адаптере:

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;
}
public void onBindViewHolder(@NonNull WordViewHolder holder, int position) {
    Word currentWord = getItem(position);
    holder.btnSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
        if (isChecked) {
            myListener.onToggleChange(currentWord, true);
            buttonView.setChecked(true);
            buttonView.setText("On");
        } else if (!isChecked) {
            myListener.onToggleChange(currentWord, false);
            buttonView.setChecked(false);
            buttonView.setText("Off");
        }
});

В MainActivity:

@Override
public void onToggleChange(Word word, boolean isChecked) {
    if (isChecked) {
        word.setLevel(200);
    } else {
        word.setLevel(300);
    }
    mWordViewModel.update(word);
}

Объект:

@Entity(tableName = "word_table")
public class Word {
    @PrimaryKey(autoGenerate = true)
    @NonNull
    private int id;
    @NonNull
    private int level;
Answer 1

При запуске активити (и не только) метод onBindViewHolder будет выполняться снова. Значит это отличное место для установки состояния, каких либо view. У вас уже есть установка состояния, НО только по нажатию на switchButton. Вам нужно выше установить состояние switchButton, не дожидаясь нажатия. Пример:

  public void onBindViewHolder(@NonNull WordViewHolder holder, int position) {
    Word currentWord = getItem(position);
    if (currentWord.level == 200) {
        buttonView.setChecked(true);
        buttonView.setText("On");
    } else {
        buttonView.setChecked(false);
        buttonView.setText("Off");
    }
    holder.btnSwitch.setOnCheckedChangeListener((buttonView, isChecked) -> {
        if (isChecked) {
            myListener.onToggleChange(currentWord, true);
            buttonView.setChecked(true);
            buttonView.setText("On");
        } else if (!isChecked) {
            myListener.onToggleChange(currentWord, false);
            buttonView.setChecked(false);
            buttonView.setText("Off");
        }
    });
READ ALSO
Инвертирование массива

Инвертирование массива

Помогите выполнить задание, ломаю голову уже 2й час

339
CopyOnWriteArrayList&lt;Integer&gt; в итерации

CopyOnWriteArrayList<Integer> в итерации

Столкнулась с такой проблемой

289
Как часто числа 0 и 1 встречаются в массиве

Как часто числа 0 и 1 встречаются в массиве

Создал массив из 10 чисел: 0 и 1, инициализировал каждый индекс массива как 0 или 1Написал цикл:

256