如何使用SimpleCursorAdapter以编程方式检查/取消选中listview

时间:2014-01-28 05:48:17

标签: android checkbox simplecursoradapter checkedtextview

我搜索过这个主题但找不到我需要的东西,所以我必须在这里寻求帮助。 基本上,我有两个片段的布局。顶部片段显示联系人组,下部片段显示所有联系人(有组或没有)。 当用户检查组时,应用会查找属于该组的所有联系人,并选中或取消选中较低片段中的联系人。

当用户选中或取消选中该组时,我需要更新联系人列表,而不仅是查看(CheckedTextView),还要查看数据(已选中/未选中)。问题是 getListView()。setItemChecked(position,value)只占用列表的位置。我有关于Contact._ID或Contact.DisplayName的信息,但不知道要更新的列表的哪个位置。我也知道光标对于需要更新的项目的位置,但该位置值与列表的位置不同。因此,当选中/取消选中某个组时,始终会选中/取消选中错误的联系人。

我已经尝试覆盖自定义的SimpleCursorAdapter中的bindView(),这样我就可以切换CheckedTextView,但它不会在屏幕上更新。

public void bindView(View view, Context context, Cursor cursor) { 
    String displayName = cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME_PRIMARY));
    CheckedTextView tv = (CheckedTextView) view.findViewById(android.R.id.text1);     
    tv.setText(displayName);
    if (selectedGroup != null && selectedGroup.containsKey(displayName)) {            
        tv.setChecked(true);            

    }
}

我可以看到 tx.setChecked(true)被调用,但未检查屏幕上受影响的行。

我是否需要在CheckedTextView中添加一个监听器?或者在打电话给tv.setChecked后我还需要做更多吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

我有以下测试代码。它使用简单光标适配器并显示电话地址簿中的联系人姓名和号码以及复选框。滚动列表时保留已选中/未选中状态的复选框。希望这可以帮助。关键是使用View Holder和带有光标位置的复选框标记视图。

public void bindView(View view, Context context, final Cursor cursor) {

    ViewHolder holder = (ViewHolder) view.getTag();
    final String displayName = cursor.getString(cursor
            .getColumnIndexOrThrow(Contacts.DISPLAY_NAME));
    final String phoneNumber = cursor
            .getString(cursor
                    .getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
    final int cursorposition = cursor.getPosition();

    // TODO Auto-generated method stub
    if (holder == null) {
        /*
         * Creates a ViewHolder and store references to the child views we
         * want to bind data to.
         */
        holder = new ViewHolder();
        holder.displayName = (TextView) view.findViewById(R.id.displayname);
        holder.phoneNumber = (TextView) view.findViewById(R.id.phonenumber);
        holder.checkbox = (CheckBox) view.findViewById(R.id.CheckBox01);
        holder.checkbox.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // Save the position of the checked item for deletion later
                ContactItem itemTag = (ContactItem) v.getTag();
                Integer position = (Integer) itemTag.getCursorposition();// v.getTag();
                if (checkedItems.contains(position)) {
                    checkedItems.remove(position);
                    // ((View)v.getParent()).setBackgroundResource(0);
                    if (map.containsKey(position)) {
                        map.remove(position);
                    }

                } else {
                    checkedItems.add(position);
                    /*
                     * ContactItem contactItem = new ContactItem();
                     * contactItem.setName(displayName);
                     * contactItem.setNumber(phoneNumber);
                     * map.put(cursorposition,contactItem);
                     */
                    map.put(position, itemTag);
                    // ((View)v.getParent()).setBackgroundResource(R.drawable.messages_background_selected);
                }

            }
        });

        view.setTag(holder);

    } else {
        holder = (ViewHolder) view.getTag();
    }

    holder.displayName.setText(displayName);
    holder.phoneNumber.setText(phoneNumber);
    holder.checkbox.setChecked(checkedItems.contains(cursorposition));

    ContactItem itemTag = new ContactItem();
    itemTag.setCursorposition(cursorposition);
    itemTag.setDisplayName(displayName);
    itemTag.setNumber(phoneNumber);
    holder.checkbox.setTag(itemTag);
    // holder.checkbox.setTag(cursorposition);
}

public Object[] getItems() {

    return map.values().toArray();
}

/**
 * Keeps references to child views to avoid unnecessary calls to
 * findViewById() on each row.
 */
private static class ViewHolder {
    private TextView displayName;
    private TextView phoneNumber;
    private CheckBox checkbox;
}