0

在我的应用程序中,我使用 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++;

            }

总是触发第一个列表条目,因为计数器是 157,而 cursor.getCount() 是 158。

我不知道这里发生了什么。我认为 cursor.moveToFirst() 将光标放在正确的位置,但事实并非如此。

我该如何解决这个问题?

编辑:我从第一个视图中读取了联系人 ID,它在任何时候都不会被取消选中,并且它没有被添加到上面代码中的集合中

4

1 回答 1

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从任何查询方法返回 a 时,它的位置是 -1,即“在第一项之前”。所以,amoveToNext()把它放在正确的位置。但是,仅当光标刚刚从查询中返回时才使用那个。如果其位置已更改,请使用前两种方法之一。

于 2013-09-18T14:34:14.920 回答