RecyclerView多个选择和ActionMode

时间:2018-11-30 23:40:41

标签: android android-recyclerview actionmode

我正在开发一个使用RecyclerView和ActionMode的应用程序。在RecyclerView项上,我有一个Imageview(mMultipleSelectionBackground)设置为GONE。基本上,当我使用长按/单击某个项目时,它将选择它并突出显示它(将ImageView更改为可见)(如果选择了多个项目,它将在每个特定项目上将ImageView更改为Visible)。我在Adapter类中做到这一点。

@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 :(得分:0)

如果您在ToDo类中添加一个额外的布尔字段会更好,默认情况下该字段为false ,以检查该条目的选择,例如

<android.support.v7.widget.RecyclerView 
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical"
app:layoutManager="android.support.v7.widget.LinearLayoutManager" />

因此,当您单击或单击项目的LongClick时,只需相应地使该布尔值 true / false ,并根据适配器中的该值onBindViewHolder编写以下代码

class ToDo{
...
private boolean isSelected;

public boolean isSelected() {
        return selected;
    }

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

因此,总体而言,此布尔值字段将帮助您轻松管理选择条目。