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