首页 文章

在内容提供程序中注入列

提问于
浏览
1

我正在使用自定义内容提供程序从我的数据库中提取数据 . 可以存在许多记录(例如10k),因此我没有实现延迟加载到列表的某种机制,而是 grab 机会创建了内容提供程序,因为它内部有一个“延迟加载”机制 . 一切顺利 . 我需要添加一个不应该进入数据库的字段(列),但它是一个选择器,一个复选框 . 说这是从DB加载的一些用户的列表,我想创建一些接近WhatsApp的东西“添加联系人到广播”(见图)

adding contacts

内容提供商的代码没什么特别之处:

@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匹配”列表或 Map 中并动态填充值)或者我应该使用其他一些机制?

1 回答

  • 1

    我做了类似的事情,一个包含收藏夹的购物清单,您可以在其中查看收藏夹以将其添加到列表中 .

    我认为它是一个多选上下文操作栏(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;
    }
    

    然后你只需要连接你的查看器检查事件去更新适配器(我将检查事件冒泡到活动级别然后再回到适配器中,因为我发现它是最简单的方法,需要其他验证但是特定于我的实现) .

相关问题