实现自定义可检查列表视图+动态适配器

时间:2012-12-22 03:07:45

标签: android listview

我已经实现了两行(名称和编号)的自定义列表视图,并且可以检查。 列表视图有多个选择选项。

每当用户搜索名称时,光标将返回新的项目列表。一旦使用新的光标项更改适配器,我就无法跟踪先前选择的项目。

例如,用户搜索名称“Jo”,它返回10个项目,其中我选择了2行。删除搜索后,光标和适配器将被更改。我无法标记选中的项目。

我想根据位置覆盖默认的可检查项目(必须自己编写,必须根据_id(联系人ID)使项目可检查) (我尝试重写onFinishInflate方法。但它没有帮助。)

任何帮助表示赞赏。 提前谢谢。

1 个答案:

答案 0 :(得分:3)

您需要的是一个对象,让您的复选框和列表视图保持您的复选框数据。布尔数组的hashmap应该足够了。

private HashMap<String, boolean[]> contactMap;

我想你可以在某些数据库方法或其他东西中加载它,你可以将这个人的名字,如“Jo”,作为标识符,如果需要的话。数组索引将对应于每个listview行中出现的复选框。然后在我认为是CursorAdapter的适配器中,您可以拥有以下内容:

private boolean[] contactObj;

public void setContactObj(boolean[] contactObj) {
    this.contactObj = contactObj;
    notifyDataSetChanged();
}

public boolean[] getContactObj() {
    return contactObj;
}

@Override
public void bindView(View view, Context context, Cursor c) {
    final int position = c.getPosition();
    final CheckBox cb = (CheckBox) view.findViewById(R.id.checkbox);

    cb.setChecked(contactObj[position]);
    cb.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (cb.isChecked()) {
                contactObj[position] = true;
            } else {
                contactObj[position] = false ;
            }
        }
    });
}

基本上,你有一个只有一个boolean[]容量的适配器,它能够调整listview中的复选框,在点击复选框时修改为boolean []然后在事件中返回它你仍然需要它。