【发布时间】:2019-03-28 12:32:10
【问题描述】:
我使用 onLongClickListener 来选中/取消选中 RecyclerView 状态的项目,并更改项目背景颜色。选择工作正常,但列表中的一些其他项目也会改变颜色(尽管它们的状态仍然是“未选择”)。我怀疑问题是由于视图被重用,但我不知道如何解决这个问题。我跟着this 实现了多项选择,这是我在应用程序中绝对需要的。
public class TasksPagedAdapter extends PagedListAdapter<Task, TaskViewHolder> {
private static DiffUtil.ItemCallback<Task> DIFF_CALLBACK = new DiffUtil.ItemCallback<Task>() {
@Override
public boolean areItemsTheSame(@NonNull Task task, @NonNull Task t1) {
return task.getId() == t1.getId();
}
@Override
public boolean areContentsTheSame(@NonNull Task task, @NonNull Task t1) {
return task.equals(t1);
}
};
private ItemClickListener itemClickListener;
protected TasksPagedAdapter(ItemClickListener itemClickListener) {
super(DIFF_CALLBACK);
setHasStableIds(true);
this.itemClickListener = itemClickListener;
}
@NonNull
@Override
public TaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int position) {
View itemRootView = LayoutInflater
.from(parent.getContext())
.inflate(R.layout.item_tarea, parent, false);
return new TaskViewHolder(itemRootView);
}
@Override
public void onBindViewHolder(@NonNull TaskViewHolder taskViewHolder, int position) {
Task taskItem = getItem(position);
int importancia = taskItem.getImportancia();
switch (importancia) {
case 0:
taskViewHolder.iv_importancia.setImageResource(R.drawable.icon_importancia_0);
break;
case 1:
taskViewHolder.iv_importancia.setImageResource(R.drawable.icon_importancia_1);
break;
case 2:
taskViewHolder.iv_importancia.setImageResource(R.drawable.icon_importancia_2);
break;
case 3:
taskViewHolder.iv_importancia.setImageResource(R.drawable.icon_importancia_3);
break;
case 4:
taskViewHolder.iv_importancia.setImageResource(R.drawable.icon_importancia_4);
break;
default:
taskViewHolder.iv_importancia.setImageResource(R.drawable.icon_importancia_0);
break;
}
taskViewHolder.tv_asunto.setText(taskItem.getAsunto());
taskViewHolder.tv_fecha_creacion.setText(taskItem.getFechaCreacion());
taskViewHolder.item_container.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
itemClickListener.onItemClick(position);
}
});
taskViewHolder.item_container.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
itemClickListener.onItemLongClick(position);
taskItem.setSelected(!taskItem.isSelected());
taskViewHolder.item_container.setBackgroundColor(taskItem.isSelected() ? Color.CYAN : Color.WHITE);
return true;
}
});
}
public Task getListItem(int position) {
return getItem(position);
}
public List<Integer> getSelectedTasks() {
List<Integer> selectedTasksIds = new ArrayList<>();
for (Task task : getCurrentList().snapshot()) {
if (task.isSelected()) {
selectedTasksIds.add(task.getId());
}
}
return selectedTasksIds;
}
@Override
public long getItemId(int position) {
return position;
}
}
【问题讨论】:
-
对于 Kotlin 用户,以下文章可能有用How to delete multiple records from Firestore using RecyclerView multi-selection?。
标签: android android-recyclerview onclicklistener android-adapter