0

我正在开发一个使用 RecyclerView 和 ActionMode 的应用程序。在 RecyclerView 项目上,我有一个设置为 GONE 的 Imageview (mMultipleSelectionBackground)。基本上,当我长按/单击一个项目时,它会选择它并突出显示它(将 ImageView 更改为可见)(如果选择了多个项目,它将在每个特定项目上将 ImageView 更改为可见)。我在 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 而不仅仅是第一个项目?

4

1 回答 1

0

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

class ToDo{
...
private boolean isSelected;

public boolean isSelected() {
        return selected;
    }

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

因此,当您单击或长按您的项目时,只需相应地将该布尔值设为真/假,并根据适配器 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();
            }
        });
    }

所以总的来说,这个布尔字段将帮助您轻松管理您的选择条目。

于 2018-12-01T05:34:40.537 回答