在Android RecyclerView中处理多重选择
我使用onLongClickListener来查看处于RecyclerView状态的项目已选中/未选中,并更改项目背景颜色。选择工作正常,但是列表中的一些附加项也会改变颜色,尽管它们的状态仍然是“未选择”。我怀疑这个问题是由于重新使用了viewholder造成的,但我不知道如何解决这个问题。我随后实现了多重选择,这是我在应用程序中绝对需要的在Android RecyclerView中处理多重选择,android,android-recyclerview,onclicklistener,android-adapter,Android,Android Recyclerview,Onclicklistener,Android Adapter,我使用onLongClickListener来查看处于RecyclerView状态的项目已选中/未选中,并更改项目背景颜色。选择工作正常,但是列表中的一些附加项也会改变颜色,尽管它们的状态仍然是“未选择”。我怀疑这个问题是由于重新使用了viewholder造成的,但我不知道如何解决这个问题。我随后实现了多重选择,这是我在应用程序中绝对需要的 public class TasksPagedAdapter extends PagedListAdapter<Task, TaskViewHolde
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;
}
}在recyclerview适配器中添加这两种方法
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemViewType(position: Int): Int {
return position
}
像这样重写适配器类中的这些方法
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemViewType(int position) {
return position;
}
RecyclerView将重用视图来填充数据
只需添加此行taskViewHolder.item\u container.setBackgroundColortaskItem.isSelected?Color.CYAN:Color.WHITE;要在滚动时修复onBindViewHolder,将为Kotlin用户设置正确的颜色,下面的文章可能会很有用。