Java RecyclerView多选-Android

Java RecyclerView多选-Android,java,android,android-recyclerview,multipleselection,Java,Android,Android Recyclerview,Multipleselection,我有RecyclerView和物品。为此,我正在创建自定义适配器。当我选择一行时,我会更改该视图的背景色。问题是当RecyclerView有很多项目时,当我单击一行时,应用程序会更改该视图的背景色,但也会更改另一行的背景色 我的适配器代码: public class NarackiAdapter extends RecyclerView.Adapter<NarackiAdapter.MyViewHolder> { private LayoutInflater inflate

我有
RecyclerView
和物品。为此,我正在创建自定义适配器。当我选择一行时,我会更改该视图的背景色。问题是当
RecyclerView
有很多项目时,当我单击一行时,应用程序会更改该视图的背景色,但也会更改另一行的背景色

我的适配器代码:

public class NarackiAdapter extends RecyclerView.Adapter<NarackiAdapter.MyViewHolder> {

    private LayoutInflater inflater;
    private List<TableItems> items = new ArrayList<>();
    private List<TableItems> selected = new ArrayList<>();

    public NarackiAdapter(Context context, List<TableItems> items) {
        inflater = LayoutInflater.from(context);
        this.items = items;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.one_item, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        final TableItems item = items.get(position);

        holder.tvName.setText(item.getQuantity() + " " + item.getProducts().getName());
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        private TextView tvName;

        public MyViewHolder(View itemView) {
            super(itemView);

            tvName = (TextView) itemView.findViewById(R.id.tvName);

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (getBackgroundColor(view) == R.color.primary) {
                view.setBackgroundResoucre(R.color.light_gray);
                selected.remove(items.get(getAdapterPosition()));
            } else {
                view.setBackgroundResoucre(R.color.primary);
                selected.add(items.get(getAdapterPosition()));
            }
        }
    }
}
公共类Narackidapter扩展了RecyclerView.Adapter{
私人充气机;
私有列表项=新的ArrayList();
所选私有列表=新建ArrayList();
公共Narackidapter(上下文、列表项){
充气器=充气器。从(上下文);
这个项目=项目;
}
@凌驾
公共MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图=充气机。充气(R.layout.one_项,父项,false);
返回新的MyViewHolder(视图);
}
@凌驾
公共无效onBindViewHolder(最终MyViewHolder,内部位置){
final TableItems=items.get(位置);
holder.tvName.setText(item.getQuantity()+“”+item.getProducts().getName());
}
@凌驾
public int getItemCount(){
返回items.size();
}
类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
私有文本视图tvName;
公共MyViewHolder(查看项目视图){
超级(项目视图);
tvName=(TextView)itemView.findViewById(R.id.tvName);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图){
if(getBackgroundColor(视图)==R.color.primary){
视图.背景背景资源(R.颜色.浅灰色);
选中。删除(items.get(getAdapterPosition());
}否则{
视图.setbackgroundresource(R.color.primary);
selected.add(items.get(getAdapterPosition());
}
}
}
}

您好,如果在onBindViewHolder()中选择或不选择,您必须按照更改颜色的逻辑进行操作,这也是因为回收商重复使用相同的视图,您必须在其中进行更新。滚动时,将触发onBindViewHolder(),因此您需要检查是否选择了当前位置的视图

编辑

大概是这样的:

@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
    final TableItems item = items.get(position);
     //checkIfSelected(item) should check in your selected items array if this item exist there
    if(checkIfSelected(item)){
       //This will be the view that you want to update background 
       view.setBackgroundResoucre(R.color.primary);
    }else{
      //This will be the view that you want to update background 
       view.setBackgroundResoucre(R.color.light_gray);
    }   
    holder.tvName.setText(item.getQuantity() + " " + item.getProducts().getName());
}

RecyclerView
重用视图!因此,如果更改一个视图的
backgroundColor
,当
RecyclerView
重用该视图时,重用将具有相同的
backgroundColor
。 解决此错误行为的方法是在
bindViewHolder
方法中实现holder更改,因为每次重用视图时都会调用它。 因此,
bindViewHolder
方法应该评估数据并决定如何查看。
您的
onClick
函数应该编辑此数据并调用
adapter.notifyItemChanged(itemPosition)
adapter.NotifyDataChanged()

对于Kotlin用户,下面的文章可能很有用。