ListView的CheckBox状态的保存及项目中会出现的奇怪情况

最近小组成员,在使用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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值