【问题标题】:How to show empty rows in a listview using cursoradapter?如何使用 cursoradapter 在列表视图中显示空行?
【发布时间】:2013-10-14 08:51:37
【问题描述】:
我有一个 Sqlite 数据库表,其中包含以下列:_id、key (int)、name (text)。这里的 key 是唯一的 key。假设我在表中有以下行:
_id |关键 |名称
1 | 2 | n2
2 | 3 | n3
3 | 5 | n5
4 | 6 | n6
现在,我必须显示此表的列表视图,从 key=1 开始,如果键存在,我将显示键后跟名称,但如果键不存在,我将显示键后跟“未分配”在表中。如何使用 CursorAdapter 做到这一点?
例如对于上表,我将显示如下列表视图:
- 未分配
- n2
- n3
- 未分配
- n5
- n6
【问题讨论】:
标签:
android
sqlite
android-cursoradapter
【解决方案1】:
我认为使用 CursorAdapter 并不容易。这种适配器的数据集是数据库中结果集上的光标。您的结果集中没有那些“未分配”的行,并且更改 SQL 以获取它们会很尴尬。如果你真的想这样做,你需要在 SELECT 列表中使用 IFNULL(name, 'Not assigned') 右连接到另一个序列号表(在 your_table.key = number_table.number 上)。您还需要为此使用原始查询。
我建议使用 ArrayAdapter,它是通过迭代结果光标并在执行过程中识别间隙来构建的。示例伪代码:
listArray = new ArrayList<String>();
int count = 1;
while (cursor.moveToNext())
{
get key and name from cursor row
while (count < key) //Add 'not assigned' for any gaps
{
listArray.add(String.valueOf(count) + ":" + "not assigned");
count++;
}
listArray.add(String.valueOf(count) + ":" + name);
count++;
}
cursor.close();
然后使用 listArray 作为 ArrayAdapter 的数据集。
【解决方案2】:
我认为这是两种最简单的方法:
-
为所有可能的键创建空行
当您在数据库中插入新行时,假设 key = 9,检查数据库中当前最高的键(此处为 6)并创建空行(名称设置为 NULL 或空字符串)在此行和您的新行之间。
然后在您的CursorAdapter 中,如果名称为空,您可以轻松显示“未分配”。
-
子类CursorWrapper
另一种方法是继承 CursorWrapper 并覆盖 move(), moveToNext(), getCount(), ... 以模拟空行。这更灵活,需要更少的空间和数据库操作,但有些方法可能很难实现(你将如何写getCount()?它应该返回最高的键,但如何有效地找到它?)。
【解决方案3】:
问题是您的数据库说明了哪些元素应该显示在您的列表中,而您想要显示哪些列表项不在您的数据库中。我会说你需要一个在数据库和视图组件之间的帮助器来加载你的数据库内容,将缺失的行添加到一组完整的数据中,并将这组数据(sqlite 数据 + 缺失的行)提供给适配器类.然后知道您的适配器列表中的行数,并可以创建此数量的视图。现在您拥有相同数量的数据对象和视图。
也许这可以帮助你。它是 google 的一个示例,用于将您的光标转换为对象。然后你可以使用 ArrayAdapter。