ListActivity中的复选框似乎是链接的;为什么?我如何解决它?

时间:2011-06-27 21:09:04

标签: android android-layout adapter listactivity

我有一个继承ListActivity的活动,并显示一个通过XML布局和自定义适配器类填充的列表。这一切都很好,正如预期的那样。行XML包含一个复选框。

现在,奇怪的是,复选框似乎每隔很多行都会链接起来。也就是说,如果我检查第0行中的复选框,那么它还会检查第8,18,28,38,48行等中的复选框。

为什么会这样,我该如何解决?

如果相关,我重新使用传递给我的适配器的视图。当我将其中一个选中的一个滚动到屏幕顶部时,似乎还有下一个要检查的是屏幕底部的第二个。

以下是我的getView代码:

public View getView(int position, View convertView, ViewGroup parent) {     
    View v = convertView;
    if (v == null) {
        LayoutInflater vi = (LayoutInflater)
            mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.contacts_row, null);
    }

    cb.GroupMembership.moveToPosition(position);
    long cid = cb.GroupMembership.getLong(0);
    String clk = cb.GroupMembership.getString(1);
    String cnm = cb.GroupMembership.getString(2);
    long pid = cb.GroupMembership.getLong(3);

    ImageView bdg = (ImageView) v.findViewById(R.id.contactBadge);
    Uri pic = GroupsLib.getContactPhotoUri(pid);
    if (pic == null) {
        bdg.setImageResource(R.drawable.contactg);
    } else {
        bdg.setImageURI(pic);
    }

    ((TextView) v.findViewById(R.id.contactName)).setText(cnm);

    return v;
}

1 个答案:

答案 0 :(得分:2)

当您重复使用视图时,您应该实际设置其中所有控件的状态(因此基本上是清理)。正是因为它被重复使用。

通常它看起来像(在适配器中):

public View getView (int position, View convertView, ViewGroup parent) {
    SomeObject obj = getDataFromYourModel(position);
    if (convertView == null) { 
        convertView = ....; //inflate view here
    } 

    setMyViewParameters(obj,convertView);
}

public void setMyViewParameters(SomeObject obj, View view) {
    CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox_id);

    cb.setChecked(obj.isChecked);
    //other initialisation
}

这样,您可以在重复使用视图时重置值。