Проблемы с MatrixCursor - PullRequest
       30

Проблемы с MatrixCursor

3 голосов
/ 24 декабря 2011

Мне нужно создать 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 контактов, этому курсору требуется много памяти, что приводит к сбою приложения.Есть ли другой способ показать этот вид списка?

1 Ответ

0 голосов
/ 29 октября 2015

С документация , mCursor.close ();Закрывает Курсор, освобождая все его ресурсы и делая его полностью недействительным.Вы должны перераспределить память, используя new, чтобы использовать ее снова.Это сработало для меня.

...