09_RecyclerView中的item复用导致状态数据丢失

问题描述:如果 RecyclerView 只是用来展示一些基本数据,然后点击进入详情页面,那么 item 的复用完全没有问题。但是如果我们需要在 item 上做一些操作,同时 item 的内容发生对应的一些变化。当我们再上下滑动 item 的时候,发现原先设置的 item 发生状态错乱,数据丢失。

原因概述:适配器中 ViewHolder 的 item 复用机制,使得 item 上的数据显示错乱。

解决办法:对绑定 item 的数据实体类进行操作,添加一个额外的 item 状态保存字段,比如 boolean isSelected。在 adapter 中,监听具体的 item 操作,将状态实时保存到该字段中,在复用的时候,将当时保存的对应位置的状态取出,对 item 显示进行相关设置。

示例代码

public class MyAdapter extends RecyclerView.Adapter {

    private List list;
    private LayoutInflater inflater;

    public MyAdapter(Context context, List list) {
        this.list = list;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new MyViewHolder(inflater.inflate(R.layout.content_main,parent));
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.textView.setText(list.get(position).getText());
        holder.checkBox.setChecked(list.get(position).isSelected);
       
        holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                holder.checkBox.setChecked(b);
                list.get(position).setSelected(b);
            }
        });
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        private CheckBox checkBox;
        public MyViewHolder(View itemView) {
            super(itemView);
        }
    }
}

你可能感兴趣的:(09_RecyclerView中的item复用导致状态数据丢失)