我正在使用定制的内容提供程序从数据库中提取数据。可能有很多记录(如10k),因此我没有实施某种延迟加载到列表的机制,而是抓住了机会并创建了内容提供者,因为它内部具有“延迟加载”的机制。一切正常。
我需要添加一个字段(列),该字段不应进入数据库,但它是一个选择器,一个复选框。说这是一些从数据库加载的用户的列表,我想在WhatsApp的附近创建一些“添加要广播的联系人”(参见图片)

android - 在内容提供者中注入(inject)一列-LMLPHP

内容提供者的代码没什么特别的:

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    ................
        Cursor cursor = customContactsDataBase.getContacts(id, projection, selection, selectionArgs, sortOrder);
        return cursor;
    }


getContacts是一个简单的SQLiteQueryBuilder,它返回一个游标。

所以,我的问题是,我应该插入这个新的复选框列吗?
如果是,则将值保留在哪里(在单独的“按ID匹配”中
列表或地图并动态填充值)
还是应该使用其他机制?

最佳答案

我做了类似的事情,一个带有收藏夹的购物清单,您可以在其中检查收藏夹以将其添加到清单中。

我认为它是多选上下文操作栏(CAB),只是被强制永久进入上下文操作栏状态。因此,我采用了与CAB相同的方法。

在我的适配器中,我添加了一个数组来保存选中的项目

private SparseBooleanArray checkedItems = new SparseBooleanArray();


我在适配器中有公共方法来切换检查,获取所有已检查项目的列表以及一些支持方法,如下所示。

public void toggleChecked(int pos) {
    Log.d(TAG, "Position " + pos);
    if (checkedItems.get(pos, false)) {
        checkedItems.delete(pos);
    } else {
        checkedItems.put(pos, true);
    }
    notifyItemChanged(pos);
}

public boolean isChecked(int pos) {
    return checkedItems.get(pos, false);
}

public void clearChecked() {
    checkedItems.clear();
    notifyDataSetChanged();
}

public int getCheckedItemCount() {
    return checkedItems.size();
}

public List<Integer> getCheckedItems() {
    List<Integer> items = new ArrayList<>(checkedItems.size());
    for (int i = 0; i < checkedItems.size(); i++) {
        items.add(checkedItems.keyAt(i));
    }
    return items;
}


然后,您只需要连接您的viewholder check事件去更新适配器(我将check事件冒泡到活动级别,然后又回到适配器,因为我发现它是最简单的方法,需要进行其他验证,但特定于我的实施)。

10-04 10:33