问题描述:如果 RecyclerView 只是用来展示一些基本数据,然后点击进入详情页面,那么 item 的复用完全没有问题。但是如果我们需要在 item 上做一些操作,同时 item 的内容发生对应的一些变化。当我们再上下滑动 item 的时候,发现原先设置的 item 发生状态错乱,数据丢失。
原因概述:适配器中 ViewHolder 的 item 复用机制,使得 item 上的数据显示错乱。
解决办法:对绑定 item 的数据实体类进行操作,添加一个额外的 item 状态保存字段,比如 boolean isSelected
。在 adapter 中,监听具体的 item 操作,将状态实时保存到该字段中,在复用的时候,将当时保存的对应位置的状态取出,对 item 显示进行相关设置。
示例代码
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private List<DataBean> list;
private LayoutInflater inflater;
public MyAdapter(Context context, List<DataBean> 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);
}
}
}