Android复选框Listview回收导致意外的盒子检查

时间:2014-02-20 21:20:08

标签: java android listview android-listview

我正在使用带有简单自定义适配器的ListView开发应用程序,每行包含一个CheckBox对象。但是,由于ListView的回收功能(我不打算关闭),当选中任何一个框时,也会检查ListView中下方或上方的其他功能。

以下是适配器中的 getView()以及自定义ViewHolder类:

public View getView(final int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;

    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.populate_friends_row, null);
        holder = new ViewHolder();
        holder.nameCheckBox = (CheckBox) convertView.findViewById(R.id.isFriend);
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    holder.nameCheckBox.setText(data.get(position).contactLabel);
    holder.nameCheckBox.setChecked(checked.get(position));
    holder.nameCheckBox.setTag(String.valueOf(position));   // to properly track the actual position
    holder.nameCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){
        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {
            int pos = Integer.parseInt(buttonView.getTag().toString());
            checked.set(pos, isChecked);
        }

    });

    return convertView;
}

public static class ViewHolder {
    public CheckBox nameCheckBox;
}

我已经按住了布尔值的ArrayList中的复选框:选中。

任何帮助将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:1)

当您调用holder.nameCheckBox.setChecked(checked.get(position));配置要为此视图显示的视图时,将调用侦听器,同时标记仍具有上一个复选框的位置。

尝试在调用null

之前删除侦听器(将其设置为setChecked