0

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

当用户选中或取消选中该组时,我需要更新联系人列表,不仅仅是查看(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 后我必须做更多事情?

非常感谢。

4

1 回答 1

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;
}      
于 2014-10-01T20:39:43.807 回答