我正在构建一个按字母顺序排序的列表。该列表应显示一个分隔线,其中包含以下图标所属的字母。
我正在使用一个包含数据库中已经排序的结果的 Cursoradapter。我计划将分隔线添加到列表项中,并在显示的字母发生变化时将其设置为可见。我怎么知道我有一封新信?有没有更好的方法然后在光标中前进或后退并检查我显示的项目是新组的结束还是开始?
我正在构建一个按字母顺序排序的列表。该列表应显示一个分隔线,其中包含以下图标所属的字母。
我正在使用一个包含数据库中已经排序的结果的 Cursoradapter。我计划将分隔线添加到列表项中,并在显示的字母发生变化时将其设置为可见。我怎么知道我有一封新信?有没有更好的方法然后在光标中前进或后退并检查我显示的项目是新组的结束还是开始?
您可以在为 Cursor 提供数据的 SQL 查询中执行此操作。
假设我们有person(name varchar)
桌子。
而不是只问:
SELECT name FROM person ORDER BY name;
可以查询:
SELECT p.name, CASE(
SELECT COUNT(*)
FROM person
WHERE name<p.name and SUBSTR(name, 1, 1)=SUBSTR(p.name,1 , 1)
) WHEN 0 THEN 1 ELSE 0 END isFirst
FROM person p
ORDER BY name;
给出 (name, isFirst) 结果集 - 每个以“new”字母开头的项目都将 isFirst 设置为 1,表示新组的开始。
编辑:示例:
CREATE TABLE person(name varchar);
INSERT INTO person SELECT 'Jim' UNION SELECT 'Tom' UNION SELECT 'Ben' UNION SELECT 'John' UNION SELECT 'Alice' UNION SELECT 'Chris' UNION SELECT 'Anna' UNION SELECT 'Jerry';
SELECT p.name, CASE(
SELECT COUNT(*)
FROM person
WHERE name<p.name and SUBSTR(name, 1, 1)=SUBSTR(p.name,1 , 1)
) WHEN 0 THEN 1 ELSE 0 END isFirst
FROM person p
ORDER BY name;
给出:
Alice|1
Anna|0
Ben|1
Chris|1
Jerry|1
Jim|0
John|0
Tom|1