在内容提供者中注入一列
Injecting a column in content provider
我正在使用自定义内容提供程序从我的数据库中提取数据。可以有很多记录(比如 10k)所以我没有实现某种延迟加载到列表的机制,而是抓住机会创建了内容提供者,因为它内部有一个 "lazy loading" 的机制。一切正常。
我需要添加一个不应进入数据库的字段(列),但它是一个选择器,一个复选框。假设这是从数据库加载的一些用户的列表,我想创建一些接近 WhatsApp 的东西 "add contacts to broadcast"(见图)
内容提供者的代码没什么特别的:
@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。
所以,我的问题是,我是否应该注入这个新的复选框列,
如果是,那么将值保存在哪里(在单独的 "matching by id"
列表或地图并动态填充值)
或者我应该使用其他机制吗?
我做过类似的事情,一个带有收藏夹的购物清单,您可以在其中检查收藏夹以将它们添加到您的列表中。
我认为它是一个多 select 上下文操作栏 (CAB),只是被迫永久进入上下文操作栏状态。所以我应用了与 CAB 相同的方法。
在我的适配器中,我添加了一个数组来保存选中的项目
private SparseBooleanArray checkedItems = new SparseBooleanArray();
我在适配器中有 public 方法来切换检查,获取所有检查项目的列表和一些支持方法,如下所示。
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 检查事件去更新适配器(我将检查事件冒泡到 activity 级别然后回到适配器,因为我发现这是最简单的方法需要其他验证,但特定于我的实现)。
我正在使用自定义内容提供程序从我的数据库中提取数据。可以有很多记录(比如 10k)所以我没有实现某种延迟加载到列表的机制,而是抓住机会创建了内容提供者,因为它内部有一个 "lazy loading" 的机制。一切正常。 我需要添加一个不应进入数据库的字段(列),但它是一个选择器,一个复选框。假设这是从数据库加载的一些用户的列表,我想创建一些接近 WhatsApp 的东西 "add contacts to broadcast"(见图)
内容提供者的代码没什么特别的:
@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。
所以,我的问题是,我是否应该注入这个新的复选框列, 如果是,那么将值保存在哪里(在单独的 "matching by id" 列表或地图并动态填充值) 或者我应该使用其他机制吗?
我做过类似的事情,一个带有收藏夹的购物清单,您可以在其中检查收藏夹以将它们添加到您的列表中。
我认为它是一个多 select 上下文操作栏 (CAB),只是被迫永久进入上下文操作栏状态。所以我应用了与 CAB 相同的方法。
在我的适配器中,我添加了一个数组来保存选中的项目
private SparseBooleanArray checkedItems = new SparseBooleanArray();
我在适配器中有 public 方法来切换检查,获取所有检查项目的列表和一些支持方法,如下所示。
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 检查事件去更新适配器(我将检查事件冒泡到 activity 级别然后回到适配器,因为我发现这是最简单的方法需要其他验证,但特定于我的实现)。