RecyclerView多选 - Android

时间:2016-09-02 14:13:35

标签: java android android-recyclerview multipleselection

我有RecyclerView项目。为此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()));
            }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

你好你已经在你的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());
}

答案 1 :(得分:-1)

RecyclerView重复使用观点!因此,如果您更改了一个视图的backgroundColor,那么当RecyclerView重复使用该视图时,重用将具有相同的backgroundcolor。 围绕这种错误行为的方法是在bindViewHolder方法中实现持有者更改,因为每次重用视图时都会调用它。 因此,bindViewHolder方法应该评估数据并决定视图。 您的onClick功能应修改此数据并致电adapter.notifyItemChanged(itemPosition)adapter.NotifyDataChanged()