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

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 实现 上拉刷新 和下拉刷新: 猛戳_网呱呱


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值