Как взаимодействовать с адаптером из Activity

Я пытаюсь скрыть itemView по нажатию кнопки. Если я это делаю из адаптера(клик по itemView), то всё работает как нужно. А если я пытаюсь скрывать из Activity, то не получается.

    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mFirebaseAdapter.startSelection();
        }
    });

    mFirebaseAdapter = new FirebaseRecyclerAdapter<TripModel, RecyclerView.ViewHolder>(options){

        boolean showCheckboxes = true;

        public void startSelection() {
            showCheckboxes = false;
            notifyDataSetChanged();
        }

        @Override
        protected void onBindViewHolder(@NonNull final RecyclerView.ViewHolder viewHolder, int position, @NonNull final TripModel model) {
            if (viewHolder instanceof DriverViewHolder) {
                ((DriverViewHolder) viewHolder).comment.setText(model.getComment());
                ((DriverViewHolder) viewHolder).phone.setText(model.getPhone());
                viewHolder.itemView.setVisibility(showCheckboxes ? View.VISIBLE: View.GONE);
                return;

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

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

Для коммуникации между активностью и адаптером можно использовать встроенный метод адаптера:

adapter.notifyItemChanged (int position, Object payload)

и в адаптере нужно переопределить метод onBindViewHolder

@Override
public void onBindViewHolder(HelloViewHolder holder, int position, List<Object> payload) {
   Log.d("butt", "payload " + payload.toString());
}

и дальше при поступлении данных в адаптер вы можете скрывать item:

holder.itemView.visibility = View.GONE;

Второй вариант - использовать интерфейс который будет передавать данные из активности в адаптер.

→ Ссылка
Автор решения: Sergei Buvaka

Адаптер ничего не должен решать сам. Он не должен сам скрывать никаких View. Все что он должен уметь это отрисовывать список который получает извне.

Каково должно быть взаимодействие в вашем кейсе?

Вы можете создать модель в которой будут поля которые вам необходимы для отображения в адаптере. Например

class Model {

    String comment;
    String phone;
    boolean visibilty;
    // другие поля по необходимости
}

Адаптер должен принимать на вход список этих самых моделей и просто отображать то что вам необходимо исходя из полей которые вы задали извне.

Для этого вы в адаптере можете создать метод в адаптере вроде такого

public void updateAdapter(List<Model> models) {
    this.models = models;
    notifyDataSetChanged();   
}

И каждый раз когда вам надо его скрыть вы просто из вашей активити вызываете метод updateAdapter() и обновляете свой список.

Взаимодействие адаптера и активити должно быть только через интерфейс. Более подробно можете посмотреть здесь.

Если вы не хотите всякий раз обновлять весь список в адаптере то стоит использовать DiffUtils, он будет обновлять только те элементы которые изменились.

→ Ссылка