【问题标题】:RecyclerView multi selection - AndroidRecyclerView 多选 - Android
【发布时间】:2017-01-10 16:40:14
【问题描述】:

我有 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()));
            }
        }
    }
}

【问题讨论】:

标签: java android android-recyclerview multipleselection


【解决方案1】:

您好,如果您在 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());
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2021-10-22
      相关资源
      最近更新 更多