Android ListView CheckBox状态错乱
2016-07-26 17:07
633 查看
lisrview的item包含checkbox时,item布局重用,会造成chechbox被反复赋值,状态错乱;
解决办法:
新建一个状态list记录每个checkbox的状态,当checkbox加载时从 状态list中取出状态值赋给checkbox,checkbox选中或取消时更新状态list中对应的状态值
主要代码:
adapter代码:
以 联系人列表:真实姓名-手机号|真实姓名-手机号 的方式收集数据
调用选中的状态的数据:
参考:
Android ListView CheckBox状态错乱
http://www.cnblogs.com/wujd/archive/2012/08/17/2635309.html
解决办法:
新建一个状态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
相关文章推荐
- Android实战打飞机游戏之怪物(敌机)类的实现(4)
- Android 应用的欢迎界面实现代码
- 结合友盟统计的多渠道快速打包
- android apk嵌套 从一个apk启动另外一个apk
- android studio 创建公共库
- Android 获取应用缓存大小与清除缓存
- Gson与Realm搭配使用碰到的问题
- android 的动画类型
- 安卓学习笔记---android系统内存不足时,应用被系统回收发生了什么?
- Android Jni sample
- Android--数据库的增删改查之数据库的更新删除
- 修改Android Gradle plugin的aapt路径
- Android 更换新logo图标后,运行项目图标没有变化的bug
- Android事件分发机制详解
- 改变AlertDialog的大小
- Android工具类
- Android 系统默认铃声修改
- Android 开发中的一些快捷键和实用网址
- 更新 Android 5.x (Lollipop) 之后的 framework/services.jar
- android测试类Test