在我的应用中,我使用SimpleCursorAdapter来显示联系人。
每个视图都有自己的复选框。为了检查所有,我通过光标,将每个ID放到一个Set,由getView()方法进行触发复选框。
问题在于:
int counter = 0;
if (cursor.moveToFirst())
while (cursor.moveToNext()) {
contact_ids_to_skip.add(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
counter++;
}
始终触发第一个列表条目,因为counter为157,而cursor.getCount()为158。
我不知道这里发生了什么。我认为cursor.moveToFirst()将光标放在正确的位置,但事实并非如此。
我该如何解决这个问题?
编辑:我从第一个视图中读取了联系人ID,它在任何时候都不会被取消选中,并且它没有被添加到上面代码中的集合
答案 0 :(得分:4)
看看你的逻辑。首先,您移动到第一条记录。紧接着,你moveToNext()
。第一项 被跳过。
一些选择:
将moveToNext()
调用移至循环结束处:
int counter = 0;
if (cursor.moveToFirst())
do {
contact_ids_to_skip.add(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
counter++;
} while(cursor.moveToNext())
将moveToFirst()
更改为moveToPosition(-1)
:
int counter = 0;
if (cursor.moveToPosition(-1))
while (cursor.moveToNext()) {
contact_ids_to_skip.add(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
counter++;
}
或者,简单地完全摆脱moveToFirst()
:
int counter = 0;
while (cursor.moveToNext()) {
contact_ids_to_skip.add(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)));
counter++;
}
最后一个可行,因为当从任何查询方法返回Cursor
时,它的位置为-1,即“在第一个项目之前”。因此,moveToNext()
将其置于正确的位置。但是,如果刚刚从查询返回Cursor,则只使用那个。如果其位置已更改,请使用前两种方法之一。