Проверка, выбраны ли все пункты в RecyclerView

Я бы хотела считать дни подряд, когда выбраны все пункты в RecyclerView. Можно ли как то это проверить средствами RecyclerView (все ли выбраны или хотя-бы сколько)?

Сейчас я сохраняю выбранные элементы в SharedPreferences с помощью json. У меня два RecyclerView и через

public void itemClicked(View view, int position) {
        Word mapperObject = wordsList.get(position)
        ...
}

я понимаю, какие из них выбраны.

Сами позиции загружаю из БД по определенному условию Собственно, нужно сравнивать кол-во выбранных позиция и кол-во загруженных из БД. Не могу понять как. Заранее спасибо


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

Автор решения: Sergei Buvaka

Предположим у нас есть есть RecyclerView с чекбоксами. Нашей задачей является получить кол-во чекнутых чекбоксов или даже список только чекнутых элементов. Для этого нам неплохо было бы иметь какую-то UiModel, вроде такой:

class UiModel {

  boolean isChecked;
  YourData data;

  // constructors, getters and setters

}

В RecyclerAdapter:

private List<UiModel> items = new ArrayList<>();

// other method

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    holder.checkBox.setChecked(items.get(position).getIsChecked());
    // bind other elements from your data like this
    holder.title.setText(items.get(position).getData().getTitle());
}

Далее у нас есть 2 пути:

  1. Это хранить все эти модели в самом RecyclerAdapter. Т.е. при каждом клике мы берем список items и в нем по нужной позиции задаем поле isCheked(). Потом просто берем и создаем какой-нибудь метод который возвращает список "чекнутых" элементов, вроде такого:

    public List<YourData> getCheckedData() {
        List<YourData> checkedList = new ArrayList<>();
        for(UiModel item : items) {
            if (item.getIsChecked()) checkedList.add(item.getData());
        }
        return checkedList;
    }
    

    Из плюсов это быстрее и проще. Минус в том, что в адаптере появляется какая-то логика, которой по хорошему быть не должно.

  2. Это хранить состояние элементов за пределами адаптера. Т.е. всякий раз когда вы вызываете клик на чекбоксе вы его обрабатываете где-нибудь в ViewModel/Presenter сохраняете если нужно в БД или производите с ним любые другие действия, а после чего вы берете уже новый список (который должен быть как предыдущий, только с нужными полями isChecked) и снова обновляете ваш адаптер.

    Из плюсов, ваш адаптер будет тупой и это круто. Вы сможете на лету обрабатывать каждый чек (к примеру отправлять запрос или сохранять в БД). Внутри Presenter/ViewModel вы сможете контроллировать состояние списка. Из минусов это более сложно в реализации + вам необходимо будет реализовать DiffUtils, чтоб не обновлять при каждом изменения все эелменты списка.

    С архитектурной точки зрения второй подход более правильный, но если вам сложно или ваш список/приложение предельно просты, то можно использовать и первый вариант.

→ Ссылка