RecyclerView несколько вариантов выбора и ActionMode - PullRequest
0 голосов
/ 01 декабря 2018

Я работаю над приложением, которое использует 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 для всех элементов, а не только для первого?

1 Ответ

0 голосов
/ 01 декабря 2018

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

class ToDo{
...
private boolean isSelected;

public boolean isSelected() {
        return selected;
    }

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

Так что, когда выщелкните или LongClick на вашем элементе, просто сделайте это логическое значение true / false соответственно и на основе этого значения внутри вашего адаптера 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();
            }
        });
    }

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

...