滑动ListView时,CheckBox控件错乱
来源:互联网 发布:p2p h.264网络摄像机 编辑:程序博客网 时间:2024/05/22 23:50
这是一个很普遍的情况,ListView的每一个View中包含CheckBox控件,在滑动屏幕时,原来点选的CheckBox貌似会发生变化,莫名其妙地乱窜:原来选中的变为没选中;原来没选中的变成选中,每滑动一下,就改变一次。
我们先来分析一下CheckBox会错乱的原因,我们在显示ListView的每一个View时,使用的是BaseAdapter的getView()方法,getView()方法的第二个参数View convertView,是会被重复使用的,也就是当滑动时产生新的View时,首先判断convertView是否为null,为null则inflate,不为null就使用已经生成的convertView。
知道了问题产生的原因,我们来说一下解决问题的思路。我一共想了两种解决策略:
1:第一次生成convertView时,保存到一个ArrayList<HashMap<Integer,View>> vmap中,Integer为该convertView对应的position,下一次getView()时,通过vmap.get(position)取得已经存在的convertView,代码如下:
private SparseArray<View> vmap = new SparseArray<View>();@Overridepublic View getView(int position, View convertView, android.view.ViewGroup parent){ viewHolder viewholder = null;//Inflate viewif(vmap.get(position)==null){viewholder = new viewHolder();convertView = mInflater.inflate(R.layout.list_item,null);viewholder.waybill = (TextView)convertView.findViewById(R.id.waybill);viewholder.addtime = (TextView)convertView.findViewById(R.id.addtime);viewholder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox);convertView.setTag(viewholder);vmap.put(position, convertView);}else{convertView = vmap.get(position);viewholder = (viewHolder)convertView.getTag();}return convertView;}/** * 私有化View控件 */public static class viewHolder{public TextView waybill;public TextView addtime;public CheckBox checkbox;}
这种方法可以解决CheckBox状态错乱的问题,但是有一个问题:有时候点击了CheckBox后,必须要滑动屏幕CheckBox的状态才会生效,还没有找到解决方法。
2:设置CheckBox的setOnCheckedChangeListener()事件,将每一个CheckBox的状态保存到一个ArrayList<HashMap<Integer,boolean>>数组中,Integer为该convertView对应的position,代码如下:
public static SparseBooleanArray checked = new SparseBooleanArray();@Overridepublic View getView(int position, View convertView, android.view.ViewGroup parent){ viewHolder viewholder = null;//Inflate viewif(convertView == null){viewholder = new viewHolder();convertView = mInflater.inflate(R.layout.list_item,null);viewholder.waybill = (TextView)convertView.findViewById(R.id.waybill);viewholder.addtime = (TextView)convertView.findViewById(R.id.addtime);viewholder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox);convertView.setTag(viewholder);}else{viewholder = (viewHolder)convertView.getTag();}final int mposition = position;viewholder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {//TODO Auto-generated method stubif(isChecked) { checked.put(mposition, isChecked); }else{ checked.delete(mposition); } }});//根据保存的状态设置CheckBoxviewholder.checkbox.setChecked(checked.get(position)==true ? true : false);}/** * 私有化View控件 */public static class viewHolder{public TextView waybill;public TextView addtime;public CheckBox checkbox;}
- 滑动ListView时,CheckBox控件错乱
- listview中嵌套checkbox滑动时错乱
- ListView滑动时CheckBox出现数据错乱
- ListView嵌套CheckBox滑动时CheckBox选中状态错乱
- ListView嵌套CheckBox滑动时CheckBox选中状态错乱
- 解决listview嵌套checkbox滑动时状态的错乱
- ListView/GridView嵌套CheckBox滑动时CheckBox选中状态显示错乱
- listview中checkbox错乱
- ListView+CheckBox错乱问题
- Listview Checkbox错乱问题
- listView checkbox错乱
- Listview Checkbox错乱问题
- listview中的checkbox错乱
- listview滑动数据错乱
- ListView优化机制及滑动时数据时出现的数据错乱重复问题 图片、checkBox等
- 解决Checkbox滑动错乱问题
- Android ListView CheckBox状态错乱
- ListView中CheckBox错乱解决
- 史上最详细的Android Studio系列教程(一)
- swr_convert函数介绍
- 问题求解
- 宏定义转换为字符串
- java显示1秒前,1分钟前,2分钟前,3天前
- 滑动ListView时,CheckBox控件错乱
- Could not find the main class: org.elasticsearch.bootstrap.Elasticsearch. Program will exit.
- DELETE ARCHIVELOG ALL COMPLETED BEFORE/after 'SYSDATE-7'与DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7'区别
- 测试驱动开发与软件重构
- 百度翻译
- JS中的prototype详解
- 简单工厂模式
- 自己学驱动17——ARM工作模式和ARM9寄存器
- IDEA安装及设置