0

我创建了一个适配器来显示联系人。它有复选框,但如果我单击一个复选框,每个 8. 元素都会被触发,尽管 OnCheckedChanged 监听器只会触发一次。

我不知道我的适配器出了什么问题,也许问题是由于某些显示内容的方法引起的,我可能需要先覆盖这些方法。

可能是什么问题呢?

public class ContactAdapter extends SimpleCursorAdapter implements
    OnCheckedChangeListener {

private Context context;

private int layout;

private Cursor cursor;

public Cursor getCursor() {
    return cursor;
}

public ContactAdapter(Context context, int layout, Cursor c, String[] from,
                      int[] to, int flags) {
    super(context, layout, c, from, to, flags);
    this.context = context;
    this.layout = layout;
    cursor = c;
}


@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
    LayoutInflater vi;

    View v = convertView;

    if (v == null) {

        v = ((LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(layout, null);

        ViewHolder holder = new ViewHolder();

        holder.imageView = (ImageView) v.findViewById(R.id.contactImage);
        holder.txtName = (TextView) v.findViewById(R.id.contactName);
        holder.txtName.setTextSize(18);
        holder.checkBox = (CheckBox) v.findViewById(R.id.checkBox);

        v.setTag(holder);
    }


    ViewHolder holder = (ViewHolder) v.getTag();
    Cursor cursor = (Cursor) getItem(position);

    String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
    holder.txtName.setText(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));

    String photoID = cursor.getString(cursor
            .getColumnIndex(ContactsContract.Contacts.PHOTO_ID));

    if (photoID != null) {
        Uri photoUri = ContentUris.withAppendedId(
                ContactsContract.Data.CONTENT_URI,
                Long.parseLong(photoID));
        holder.imageView.setImageURI(photoUri);

    } else
        holder.imageView.setImageResource(R.drawable.ic_launcher);


    holder.checkBox.setTag(id);
    holder.checkBox.setOnCheckedChangeListener(this);

    return v;
}

@Override
public void onCheckedChanged(CompoundButton v, boolean isChecked) {
    //TODO
}

static class ViewHolder {
    TextView txtName;
    ImageView imageView;
    CheckBox checkBox;
}


}
4

1 回答 1

0

那是因为视图被重用以提高性能,在您的情况下,每个 8 个元素都获得相同的视图,原因被调用相同的convertView. (你可以记录你的convertView变量,你会看到这个)。

getView所以,要解决这个问题,你必须在别处设置复选框的状态,并在你的方法中每次都建立它,如下所示:

holder.checkBox.setTag(id);
holder.checkBox.setChecked(mapOfStoredCheckedContacts.get(id));
holder.checkBox.setOnCheckedChangeListener(this);

为此,请创建一个变量:

Map<String,Boolean> mapOfStoredCheckedContacts=new HashMap<String,Boolean>

并将状态保持在侦听器中,如下所示:

@Override
public void onCheckedChanged(CompoundButton v, boolean isChecked) {
    mapOfStoredCheckecContacts.put(v.getTag(),isChecked);
    //More code
}
于 2013-09-08T13:44:56.820 回答