RecyclerView множественный выбор и ActionMode

Я работаю над приложением, которое использует RecyclerView и ActionMode. В элементе RecyclerView у меня есть Imageview (mMultipleSelectionBackground), для которого установлено значение GONE. В основном, когда я использую долгий щелчок / щелчок по элементу, он выбирает его и выделяет (изменяя ImageView на видимый) (если выбрано несколько элементов, он изменит ImageView на Visible для каждого конкретного). Я делаю это в классе адаптера.

@Override
    public boolean onLongClick(View view) {
        int longClickedPosition = getAdapterPosition();
        mLongClickListener.onToDoLongClick(longClickedPosition);
        ToDo toDo = mToDos.get(longClickedPosition);
        try {
            /**
             * Check to see if the item is selected
             * @mMultipleSelections - use this to block the long click if the user already did it on an item
             */
            if (!toDo.isSelected() && mMultipleSelections <= 0){
                toDo.setSelected(true);
                mMultipleSelections++;
                selectedToDos.add(longClickedPosition);
                mMultipleSelectionBackground.setVisibility(View.VISIBLE);
                view.startActionMode(mActionModeCallback);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

Все идет нормально. Проблема, с которой я столкнулся, заключается в том, что когда я использую onDestroyActionMode, я хочу, чтобы ImageView для всех элементов был возвращен в состояние GONE, но это не так. Меняется только первый (и действительно, по этой логике, это нормально).

@Override
        public void onDestroyActionMode(ActionMode actionMode) {
            Log.d(LOG_TAG, "DESTROY");
            for (int x = 0; x < selectedToDos.size(); x++) {
                mMultipleSelectionBackground.setVisibility(View.GONE);
                mToDos.get(x).setSelected(false);
            }
            mMultipleSelections = 0;
        }

У меня вопрос: как изменить ImageView для всех элементов, а не только для первого?

0
0
481
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

class ToDo{
...
private boolean isSelected;

public boolean isSelected() {
        return selected;
    }

    public void setSelected(boolean selected) {
        this.selected = selected;
    }
...
}

Поэтому, когда вы нажимаете или LongClick на свой элемент, просто сделайте это логическое значение правда / ложь соответственно и на основе этого значения внутри вашего адаптера onBindViewHolder напишите следующий код

@Override
    public void onBindViewHolder(@NonNull final UserViewHolder userViewHolder, int position) {
        final Todo todo=mTodos.get(position);            
        if (todo.isSelected()){
            viewHolder.imageView.setVisibility(View.VISIBLE);
        }else{
            viewHolder.imageView.setVisibility(View.GONE);
        }
        viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                todo.setSelected(!todo.isSelected());
                notifyDataSetChanged();
            }
        });
    }

Итак, в целом это логическое поле поможет вам легко управлять записями выбора.

Привет. Да, уже использовал логическое значение isSelected, но совершенно забыл о notifyDataSetChanged (); Это сработало. Спасибо: D

Bandes 02.12.2018 23:55

Другие вопросы по теме