首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >RecyclerView多选-安卓

RecyclerView多选-安卓
EN

Stack Overflow用户
提问于 2016-09-02 22:13:35
回答 2查看 765关注 0票数 0

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

我的适配器代码:

代码语言:javascript
运行
复制
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()));
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-09-02 22:29:52

您好,如果在您的onBindViewHolder()中选择了或没有选择,您必须执行更改颜色的逻辑,这也是因为回收器重用了相同的视图,并且您必须在那里更新它。滚动时,onBindViewHolder()将被触发,因此您需要检查是否选中了“在当前位置查看”。

编辑

如下所示:

代码语言:javascript
运行
复制
@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());
}
票数 0
EN

Stack Overflow用户

发布于 2016-09-02 23:43:41

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39294511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档