天天看點

解決ListView中checkBox選中狀态錯亂問題

1.問題

  當在listview中的item設定checkbox後,滑動listview會出現checkbox選中狀态錯亂的問題,例如,選中第一個資料,當将listview滑動到底部再滑動到頂部時,選中狀态發生錯亂(可能變成第五條資料被選中)。

2.分析原因

  假設android系統在listview給我們生成了10個view對象,這些view對象是共用的(隻是資料不同),第一個view對象在第一屏的時候需要顯示成”未選擇”狀态,而到了第二屏的時候,卻要顯示成”選擇”狀态,但由于是共用的同一個對象,當checkBox的狀态改變的時候,會調用onCheckedChange()方法,是以會出現狀态錯亂的問題。

3.解決辦法

  以下給出解決辦法(部分邏輯代碼)

@Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = View.inflate(context, R.layout.shoopingcrtlist_item, null);
            viewHolder.choose = (CheckBox) convertView.findViewById(R.id.cbCheckBox);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

       //排除checkbox錯亂的方法
        viewHolder.choose.setTag(position);
        viewHolder.choose.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
                    datas.get(po).setCheck(true);
                }else{
                    //若未選中,就根據綁定的position找到相對應的控件設定狀态為false
                    datas.get(po).setCheck(false);
                }
            }
        });

        viewHolder.choose.setChecked(datas.get(position).isCheck());
       
        return convertView;
    }