ListView的CheckBox状态的保存及项目中会出现的奇怪情况
来源:互联网 发布:搜狐网络大厦邮政编码 编辑:程序博客网 时间:2024/06/16 03:27
最近小组成员,在使用listview中出现了奇怪的现象,先描述一下这个奇怪的现象:首先他给checkbox设定了OnCheckedChangeListener监听器,当点击的时候,就修改该条item,对应的bean中保存的checkbox状态值,并且将该item添加到选中的集合中,反之就去除集合中的该元素,当convertView复用的时候,他又重新设定当前的状态。可是其奇怪的现象出现了,当复用convertView的使用,任然没有保存状态。那么好,我们看看该问题所在的getView()方法。
我仿照他的写法写了一个:
private Context mContext; private List<ListBean> mAdapterDataList; private LayoutInflater mInflater; public MyAdapter(Context context, List<ListBean> dataList) { this.mContext = context; this.mAdapterDataList = dataList; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { if (mAdapterDataList == null) { return 0; } return mAdapterDataList.size(); } @Override public ListBean getItem(int position) { return mAdapterDataList.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.item_activity_main, parent, false); convertView.setTag(new ViewHolder(convertView)); } ViewHolder holder = (ViewHolder) convertView.getTag(); //设定checkbox的状态 **holder.mCheckBox.setChecked(getItem(position).isCheck());** holder.mTextView.setText(getItem(position).getText()); //给监听器中设定当前的需要操作的对象 holder.mCheckBox.setTag(getItem(position)); holder.mCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override **public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // 在这里进行保存自己选中的item ListBean bean = (ListBean) buttonView.getTag(); //保存checkbox对应的状态 bean.setCheck(isChecked); if (isChecked) { if (!mSelectItem.contains(bean)) { mSelectItem.add(bean); } } else { mSelectItem.remove(bean); } }** }); return convertView; }}public static class ViewHolder { private CheckBox mCheckBox; private TextView mTextView; public ViewHolder(View view) { mCheckBox = (CheckBox) view.findViewById(R.id.check_box); mTextView = (TextView) view.findViewById(R.id.text_view); }}`
不知道你有没有发现这段代码中的bug,我来看看他需要改进的地方
第一:在convertView 不为null的时候,他在调用holder.mCheckBox.setChecked(getItem(position).isCheck());方法的时候,会触复用前一convertView的OnCheckedChangeListener的onCheckedChanged()的方法,就会把之前的那个状态给改变掉,这也就为什么出现没有没有保存状态的原因。
第二:每次复用convertView 的时候,都会new OnCheckedChangeListener的对象,就会造成创建很多OnCheckedChangeListener对象,那么对内存管理来说也不是很好。
解决办法:
1、解决第一个bug,将设置OnCheckedChangeListener监听器和holder.mCheckBox.setChecked(getItem(position).isCheck())方法的顺序调换一下,那么就不会出现下一个复用,调用上一个的onCheckedChanged()方法。
2、解决第二个bug,当convertView==null的时候设定监听器,那么就不会创建多余的监听器。
下载源码
- ListView的CheckBox状态的保存及项目中会出现的奇怪情况
- listview中的checkbox状态保存与恢复的完美方法
- listview中checkbox状态保存
- Android中EditText在ListView中会出现消失的情况
- 保存Repeater控件中input CheckBox的选中状态
- ListView 中CheckBox与RadioButton的状态解决方法
- android开发--listview中checkbox的选中状态
- Android ListView/GridView的item中 CheckBox状态错乱
- android ListView 中CheckBox选中后,状态混乱的解决方案
- 关于ListView中checkBox选中状态错乱问题的解决办法
- CheckBox的选择状态会根据ListView或GridView的滑动而自动改变
- android listView滚动时checkBox的状态不会保存的问题
- Android ListView在有checkbox的情况下上下滑动选中状态错误以及position错乱
- 保存GridView checkbox 选中的状态(Session)
- easyui 分页保存checkbox的选中状态
- 解决 listview 中添加 checkbox 出现的问题
- Android之ListView的CheckBox状态错乱
- Hibernate中Oracle保存出现没有反应的情况
- java集合类TreeMap和TreeSet
- (二十) 理解和解决angularJS报错$apply already in progress
- 2.4G wifi 的频道/信道 20M 40M的概念,区别
- Android Performance Tips
- Spring中Singleton模式的线程安全
- ListView的CheckBox状态的保存及项目中会出现的奇怪情况
- selenium使用send_keys()方法写中文报错的解决方法
- Specular BRDF Reference
- 氢气球伤人
- Activity四种启动模式详细讲解
- Python的图形界面工具----PyQt
- android-打电话
- Android Studio gradle文件配置
- AbsListView$RecycleBin简析