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的时候设定监听器,那么就不会创建多余的监听器。

下载源码

0 0