ListView,RecyclerView遇CheckBox复用混乱解决方案

来源:互联网 发布:数据库考证 编辑:程序博客网 时间:2024/05/06 00:16

ListView,RecyclerView的复用机制,是为了减轻程序运行的压力,但又会由于复用而带来些许错乱问题,这里小编给大家提出一个解决方案,那么先说下解决思路:

1.复用:复用的是Views和datas(数据状态),也就是Holder和XXDataBean;

2.通过在"同个类"中记录的每个view的数据状态,强制改变view的显示状态;

3.当状态被改变时,同步更新"同个类"中临时保存的状态;


那么不再废话,直接上代码,这里以RecyclerView为例:

Adapter类中代码:

 public  class ReAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements CompoundButton.OnCheckedChangeListener{    private  Activity activity;    private int TITLE_TYPE =  0; //标题类型    private int CONTENT_TYPE = 1; //内容类型    private  String[] titles;    private List<Integer> contentListT;    private ArrayList<Boolean> contentListCBox;    public ReAdapter(Activity activity, RecycleBean bean) {        this.contentListT = bean.contentListT;        this.titles = bean.titles;        this.contentListCBox = bean.contentListCBox;        this.activity = activity;    }    @Override    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        if (viewType == TITLE_TYPE) {            View view = activity.getLayoutInflater().inflate(R.layout.adapter_title, new RelativeLayout(activity));            RecycleTitleHolder recycleTitleHolder = new RecycleTitleHolder(view);            return recycleTitleHolder;        }        View view = activity.getLayoutInflater().inflate(R.layout.adapter_content, new RelativeLayout(activity));        RecycleContentHolder recycleContentHolder = new RecycleContentHolder(view);        recycleContentHolder.contentCBox.setOnCheckedChangeListener(this); //监听不可重复设置        return recycleContentHolder;    }    @Override    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //数据绑定        int itemViewType = getItemViewType(position);        if (itemViewType==TITLE_TYPE) {            ((RecycleTitleHolder) holder).titleT.setText(titles[position]);        }else if (itemViewType==CONTENT_TYPE) {            ((RecycleContentHolder) holder).bindData(contentListT,contentListCBox,position);        }    }    @Override    public int getItemCount() {        return contentListT.size();    }    @Override    public int getItemViewType(int position) {        if (position%9==0) {            return TITLE_TYPE;        }        return CONTENT_TYPE;    }    @Override    public void onCheckedChanged(CompoundButton checkbox, boolean b) { //数据修改        int position = (int) checkbox.getTag();        contentListCBox.set(position, b);        //绑定和修改的contentListCBox集合,一定要放在同一个类中,如Adapter或Holder等均可(重点部分)    }}

Holder类中代码:

public class RecycleContentHolder extends RecyclerView.ViewHolder {    public TextView contentT;    public CheckBox contentCBox;    public RecycleContentHolder(View contentView) {        super(contentView);        contentT = (TextView) contentView.findViewById(R.id.content_tv);        contentCBox = (CheckBox) contentView.findViewById(R.id.checkbox_content);    }    public void bindData(List<Integer> contentListT, ArrayList<Boolean> contentListCBox, int position) {        contentT.setText(String.valueOf(contentListT.get(position)));        contentCBox.setTag(position);//要先设置position给contentCBox,然后再setChecked();此处顺序不能颠倒(重点)        contentCBox.setChecked(contentListCBox.get(position));    }}

Activity中部分代码:

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);        linearLayoutManager.setOrientation(OrientationHelper.VERTICAL); //布局方向//        recyclerview.addItemDecoration( new item); //分割线//        recyclerview.setItemAnimator();   //添加动画        ReAdapter reAdapter = new ReAdapter(this,bean);        recyclerview.setLayoutManager(linearLayoutManager);        recyclerview.setHasFixedSize(true); //保存item尺寸值,以便不在测量        recyclerview.setAdapter(reAdapter);        

其他此类文章: http://www.wfuyu.com/technology/23153.html

Android RecyclerView 使用完全解析: 猛戳_网址大大  

SwipeRefreshLayout + RecyclerView 实现 上拉刷新 和下拉刷新: 猛戳_网址呱呱


0 0
原创粉丝点击