关于ListView中checkBox选中状态错乱问题的解决办法
2016-07-15 20:22
537 查看
PS:提供这两种办法的人都没有解释到底是为什么错乱.下面来尝试分析一下:
1:首先分析下viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()…);
这句话,就是给checkBox添加一个监听器,如果checkBox的状态改变了,那么系统就会自动回调里面的onCheckedChange()方法.
2:再接着分析下if(list.get(position).type == A.TYPE_CHECKED){…},这部分代码是根据list集合里的对象属性初始化view里checkBox是否应该是选择状态.
3:我上下滑动listView的时候,checkBox的状态就错乱了,根据第二点的分析,无论如何checkBox的状态都不会错乱,除非list集合里对象的属性已经被改变了,到底是什么地方改变了它?
4:文中只有一个地方写了改变list集合里checkBox对象属性的地方,那就是第一点里提到的OnCheckedChangeListener()方法。它被执行了?
怎么回事,不可能吧,打个断点,跑一下便知上下滑动listView的时候确实停了下来.
5:这便是convertView的功能,因为不管listView里显示多少条数据,都只是共用那么几个对象,然后我们的代码每一次把得到的对象重新赋值而已。
对了,正是在这赋值的时候出了问题,假设android系统给我们生成了10个共用view对象,第一个view对象在第一屏的时候需要显示成”未选择”状态,而到了第二屏的时候,却要显示成”选择”状态,但由于是共用的同一个对象,根据第一点得知当checkBox的状态改变的时候,会调用onCheckedChange()方法。
以下是在代码中的解决方案
1:首先分析下viewHolder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener()…);
这句话,就是给checkBox添加一个监听器,如果checkBox的状态改变了,那么系统就会自动回调里面的onCheckedChange()方法.
而文中onCheckedChange()方法里写的是记录这次改变后checkBox状态的代码.
2:再接着分析下if(list.get(position).type == A.TYPE_CHECKED){…},这部分代码是根据list集合里的对象属性初始化view里checkBox是否应该是选择状态.
3:我上下滑动listView的时候,checkBox的状态就错乱了,根据第二点的分析,无论如何checkBox的状态都不会错乱,除非list集合里对象的属性已经被改变了,到底是什么地方改变了它?
4:文中只有一个地方写了改变list集合里checkBox对象属性的地方,那就是第一点里提到的OnCheckedChangeListener()方法。它被执行了?
怎么回事,不可能吧,打个断点,跑一下便知上下滑动listView的时候确实停了下来.
5:这便是convertView的功能,因为不管listView里显示多少条数据,都只是共用那么几个对象,然后我们的代码每一次把得到的对象重新赋值而已。
对了,正是在这赋值的时候出了问题,假设android系统给我们生成了10个共用view对象,第一个view对象在第一屏的时候需要显示成”未选择”状态,而到了第二屏的时候,却要显示成”选择”状态,但由于是共用的同一个对象,根据第一点得知当checkBox的状态改变的时候,会调用onCheckedChange()方法。
以下是在代码中的解决方案
package com.bawei.studentshop.adapter; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.ImageView; import android.widget.TextView; import com.bawei.studentshop.R; import com.bawei.studentshop.bean.ShoopCarResponse; import java.util.List; /** * Created by Administrator on 2016/7/15 0015. */ public class ShopCarAdapter extends BaseAdapter { private Context context; private List<ShoopCarResponse.ListBean> list; private int count = 0; public ShopCarAdapter(Context context, List<ShoopCarResponse.ListBean> list) { this.context = context; this.list = list; } @Override public int getCount() { return list.size(); } @Override public Object getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; if (convertView == null) { holder = new ViewHolder(); convertView = View.inflate(context, R.layout.shoopingcrtlist_item, null); holder.cb = (CheckBox) convertView.findViewById(R.id.cbCheckBox); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } //重点就是给每个CheckBox控件设置标记 holder.cb.setTag(position); holder.cb.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //先把View转型为CheckBox CheckBox c= (CheckBox) v; //获取当前控件的Tag,即与其绑定的position int po = (int) c.getTag(); //判断当前控件是否选中 if (c.isChecked()) { //若选中,就根据绑定的position找到相对应的控件设置状态为turn list.get(po).setCheck(true); }else{ //若未选中,就根据绑定的position找到相对应的控件设置状态为false list.get(po).setCheck(false); } } }); holder.cb.setChecked(list.get(position).isCheck()); holder.title.setText(list.get(position).getName()); holder.number.setText(list.get(position).getCid() + ""); holder.price.setText("¥" + list.get(position).getCost()); return convertView; } class ViewHolder { TextView title, number, price; ImageView goodsImg, jian, jia, jianTou; CheckBox cb; } }
相关文章推荐
- 44 个 JavaScript 变态题解析
- 前端开发人员必须了解的七大技能图谱
- 天梯赛 L2-011. 玩转二叉树(数据结构)
- oracle连接串的一种写法
- C++大数模板
- oracle连接串的一种写法
- sublimeText 快捷键
- iOS开发-使用AVAudioPlayer实现音乐播放器
- jzoj 1569. 【普及模拟】公共子串 解题报告
- 结构化随机森林源码分析
- HashMap与Hashtable(二)
- Unity3d自带寻路Navmesh三大组件
- [javascript权威指南][阅读笔记]五
- 对类成员访问权限的控制,是通过设置成员的访问控制属性实现的,下列不是访问控制属性的是( )
- 12.Which is the correct description of a pinned buffer in the database buffer cache?
- firefox等浏览器清除a标签点击后的虚线问题
- React Native点击按钮修改页面
- 莫比乌斯反演入门 HDOJ 1695:GCD 、BZOJ 2301: [HAOI2011]Problem b
- nginx负载均衡
- poj3254 Corn Fields (状压dp)