Android ListView CheckBox状态错乱

   lisrview的item包含checkbox时,item布局重用,会造成chechbox被反复赋值,状态错乱;

解决办法:

    新建一个状态list记录每个checkbox的状态,当checkbox加载时从 状态list中取出状态值赋给checkbox,checkbox选中或取消时更新状态list中对应的状态值

Android ListView CheckBox状态错乱_第1张图片

主要代码:

adapter代码:

import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;

import com.xiebao.R;
import com.xiebao.fatherclass.fatheradapter.BaseListAdapter;
import com.xiebao.mingpian.cardholder.other.PhoneInfo;
import com.xiebao.util.StateClass;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * Created by admin on 2016/7/25.
 */
public class PhoneContactsAdapter extends BaseListAdapter{

    public LinkedList idList;
    //记录checkbox的状态列表
    protected ArrayList stateList=new ArrayList();
    //选中数据的列表,数据有唯一性
    protected Set phoneInfoSet =new HashSet<>();


    public LinkedList getIdList() {
        //把phoneInfoSet转为linkedList
        idList=new LinkedList(phoneInfoSet);
        return idList;
    }

    @Override
    public void updateData(List data) {
        for(int i=0;i data) {
        super(context, data);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if(convertView==null){
            viewHolder=new ViewHolder();
            convertView = inflater.inflate(R.layout.adaper_mingpian_phone_llayout,
                    parent, false);
            //初始化ui

            //姓名
            viewHolder.nameText=findView(convertView,R.id.name);
            //电话
            viewHolder.numberText=findView(convertView,R.id.number);
            viewHolder.checkBox=findView(convertView,R.id.check_box);

            convertView.setTag(viewHolder);
        }else{
            viewHolder=(ViewHolder) convertView.getTag();
        }
        //获得单个员工信息
        final PhoneInfo data=(PhoneInfo) getItem(position);

        setText(viewHolder.nameText,data.getName());
        setText(viewHolder.numberText,data.getNumber());
        checkChangeListener(viewHolder.checkBox,data,position);
        return convertView;
    }

    protected void checkChangeListener(CheckBox checkbox, final PhoneInfo data, final int index) {
        checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        //状态改变监听
                if(isChecked){
                    //选中
                    phoneInfoSet.add(data);
                    stateList.get(index).type=StateClass.TYPE_CHECKED;
                }else{
                    //不选中
                    phoneInfoSet.remove(data);
                    stateList.get(index).type=StateClass.TYPE_NOCHECKED;
                }
            }
        });
        //选中的数据加入集合
        if(TextUtils.equals(data.getIs_check(),"1")){
            checkbox.setChecked(true);
            stateList.get(index).type=StateClass.TYPE_CHECKED;
            phoneInfoSet.add(data);
        }
        //把状态恢复到checkbox
        if(stateList.get(index).type==StateClass.TYPE_CHECKED){
            checkbox.setChecked(true);
        }else{
            checkbox.setChecked(false);
        }
    }
    class ViewHolder{
        TextView nameText;
        TextView numberText;
        CheckBox checkBox;

    }
}
记录状态类:

/**
 * @ClassName:
 * @Description:记录listview中,checkbox的状态
 * @author gongxibo
 * @date 创建时间:2015年9月1日 上午10:05:08
 */
public class StateClass {
	public static final int TYPE_CHECKED = 1;
	public static final int TYPE_NOCHECKED = 0;

	public int type;

	public StateClass(int type) {
		this.type = type;
	}
}
item 数据类:

public class PhoneInfo {
    private String name;
    private String number;
    private String is_check;

    public String getIs_check() {
        return is_check;
    }

    public void setIs_check(String is_check) {
        this.is_check = is_check;
    }


    public PhoneInfo(String name, String number) {
        this.name = name;
        this.number = number;
    }
    public String getName() {
        return name;
    }
    public String getNumber() {
        return number;
    }
}


以  联系人列表:真实姓名-手机号|真实姓名-手机号 的方式收集数据
调用选中的状态的数据:

    protected String getSonList() {
        LinkedList list = contactsAdapter.getIdList();
        final StringBuilder sb = new StringBuilder();

        if(list.isEmpty()){
            return null;
        }
        for(int i=0;i
debug查看选中的数据:

Android ListView CheckBox状态错乱_第2张图片

参考:

Android ListView CheckBox状态错乱
http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html



你可能感兴趣的:(listview,android)