0

私のアプリでは、連絡先を表示するために SimpleCursorAdapter を使用しています。

各ビューには独自のチェックボックスがあります。すべてをチェックするために、カーソルを調べて、各 ID をセットに入れます。これは、チェックボックスをトリガーする 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を読み取りましたが、これはどの時点でもチェックされていませんが、上のコードのセットに追加されていません

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++;
   }

Cursoraがクエリメソッドから返されたとき、その位置は -1 であり、これは「最初の項目の前」であるため、最後の機能です。だから、moveToNext()それを正しい場所に置きます。ただし、カーソルがクエリから返されたばかりの場合にのみ使用してください。その位置が変更されている場合は、最初の 2 つの方法のいずれかを使用します。

于 2013-09-18T14:34:14.920 に答える