3

ListView連絡先に複数の番号がある場合、同じ連絡先に対して複数の行を作成する必要があります。したがって、3 つの番号を持つ連絡先は、 の 3 つの別々の行として表示されますListView。そのMatrixCursorために、個別の行を追加してから、このカーソルを に追加するための を作成しましたListView

    private static final String[] arr = { "_id", "name", "type_int", "value" };
    final String[] projection = new String[] { Phone.NUMBER, Phone.TYPE, };
    add_cursor = new MatrixCursor(arr);
    String[] values = { "", "", "", "" };

    Cursor cursor = argcontext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, buffer == null ? null : buffer.toString(), args, ContactsContract.Contacts.DISPLAY_NAME + " ASC ");

    if (cursor != null && cursor.moveToFirst()) {
        int i = 0;
        do {
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            cursor.getCount());
            Cursor phone = argcontext.getContentResolver().query(Phone.CONTENT_URI, projection, Data.CONTACT_ID + "=?", new String[] { contactId }, null);
            if (phone != null && phone.moveToFirst()) {
                do {
                    number = phone.getString(phone.getColumnIndex(Phone.NUMBER));
                    final int type = phone.getInt(phone.getColumnIndex(Phone.TYPE));
                    values[0] = String.valueOf(i);
                    values[1] = String.valueOf(name);
                    values[2] = String.valueOf(type);
                    values[3] = String.valueOf(number);
                    add_cursor.addRow(values);
                    i++;
                } while (phone.moveToNext());
                phone.close();
            }
        }
    }

それは完全に機能していますが、私の問題は、バックグラウンドでデータが変更されたときに、このコードを再度呼び出す必要があることですが、そのためには、最初にこのカーソル値をクリアするか、その中のすべての行を削除してから、新しい行を追加し続ける必要があります。やり方がわからない。ありません:

cursor.removeRow()

関数なので、連絡先データが変更された場合は、この関数を再度呼び出す必要があり、作成を続ける場合:

new MatrixCursor(); 

そのたびrequeryに、アプリケーションのメモリ フットプリントが大きくなります。これにより、アプリケーションがクラッシュします。たとえば、3000 の連絡先がある場合、このカーソルには大量のメモリが必要になり、アプリケーションがクラッシュします。この種のリストを表示する他の方法はありますか?

4

1 に答える 1

0

ドキュメンテーションから、mCursor.close(); Cursor を閉じて、すべてのリソースを解放し、完全に無効にします。new を使用して再度使用するには、メモリを再割り当てする必要があります。それは私のために働いた。

于 2015-10-29T12:08:32.340 に答える