在Android RecyclerView中处理多重选择

在Android RecyclerView中处理多重选择,android,android-recyclerview,onclicklistener,android-adapter,Android,Android Recyclerview,Onclicklistener,Android Adapter,我使用onLongClickListener来查看处于RecyclerView状态的项目已选中/未选中,并更改项目背景颜色。选择工作正常,但是列表中的一些附加项也会改变颜色,尽管它们的状态仍然是“未选择”。我怀疑这个问题是由于重新使用了viewholder造成的,但我不知道如何解决这个问题。我随后实现了多重选择,这是我在应用程序中绝对需要的 public class TasksPagedAdapter extends PagedListAdapter<Task, TaskViewHolde

我使用onLongClickListener来查看处于RecyclerView状态的项目已选中/未选中,并更改项目背景颜色。选择工作正常,但是列表中的一些附加项也会改变颜色,尽管它们的状态仍然是“未选择”。我怀疑这个问题是由于重新使用了viewholder造成的,但我不知道如何解决这个问题。我随后实现了多重选择,这是我在应用程序中绝对需要的

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用户设置正确的颜色,下面的文章可能会很有用。