RecyclerView 多选和 ActionMode
RecyclerView multiple selections and ActionMode
我正在开发一个使用 RecyclerView 和 ActionMode 的应用程序。在 RecyclerView 项目上,我有一个设置为 GONE 的 Imageview (mMultipleSelectionBackground)。基本上,当我使用长按/单击一个项目时,它会 select 它并突出显示它(将 ImageView 更改为可见)(如果多个项目被 selected,它会将每个 ImageView 更改为可见特别的一个)。我在适配器 class.
中执行此操作
@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 而不仅仅是第一个项目?
如果您在 ToDo class 中再添加一个额外的布尔字段 会更好,默认情况下该字段为 false 以检查该条目的选择,例如
class ToDo{
...
private boolean isSelected;
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
...
}
因此,当您单击或长按您的项目时,只需相应地使布尔值 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();
}
});
}
总的来说,这个布尔字段将帮助您轻松管理您的选择项。
我正在开发一个使用 RecyclerView 和 ActionMode 的应用程序。在 RecyclerView 项目上,我有一个设置为 GONE 的 Imageview (mMultipleSelectionBackground)。基本上,当我使用长按/单击一个项目时,它会 select 它并突出显示它(将 ImageView 更改为可见)(如果多个项目被 selected,它会将每个 ImageView 更改为可见特别的一个)。我在适配器 class.
中执行此操作@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 而不仅仅是第一个项目?
如果您在 ToDo class 中再添加一个额外的布尔字段 会更好,默认情况下该字段为 false 以检查该条目的选择,例如
class ToDo{
...
private boolean isSelected;
public boolean isSelected() {
return selected;
}
public void setSelected(boolean selected) {
this.selected = selected;
}
...
}
因此,当您单击或长按您的项目时,只需相应地使布尔值 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();
}
});
}
总的来说,这个布尔字段将帮助您轻松管理您的选择项。