循环游标与android上的游标数不一样

时间:2013-09-18 14:18:15

标签: android simplecursoradapter

在我的应用中,我使用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,它在任何时候都不会被取消选中,并且它没有被添加到上面代码中的集合

1 个答案:

答案 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,则只使用那个。如果其位置已更改,请使用前两种方法之一。