您的位置:首页 > 移动开发 > Android开发

Android ListView CheckBox状态错乱

2016-07-26 17:07 633 查看
   lisrview的item包含checkbox时,item布局重用,会造成chechbox被反复赋值,状态错乱;

解决办法:

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



主要代码:

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<PhoneInfo>{

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

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

@Override
public void updateData(List<PhoneInfo> data) {
for(int i=0;i<data.size();i++){
//初始化checkbox的状态,默认全部不选中
stateList.add(new StateClass(StateClass.TYPE_NOCHECKED));
}
super.updateData(data);
}

public PhoneContactsAdapter(Context context) {
super(context);
}

public PhoneContactsAdapter(Context context, List<PhoneInfo> 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<PhoneInfo> list = contactsAdapter.getIdList();
final StringBuilder sb = new StringBuilder();

if(list.isEmpty()){
return null;
}
for(int i=0;i<list.size();i++){
final PhoneInfo phoneInfo = list.get(i);
String  concat= phoneInfo.getName().concat("-").concat(phoneInfo.getNumber());
sb.append(concat).append("|");
}
sb.deleteCharAt(sb.length()-1);
return sb.toString();
}
debug查看选中的数据:



参考:

Android ListView CheckBox状态错乱
http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: