2011-12-24 3 views
3

Мне нужно создать ListView с несколькими строками для одного и того же контакта, если контакт имеет несколько номеров. Таким образом, контакт с 3 номерами будет отображаться как 3 отдельных строки в ListView. Для этого я создал MatrixCursor для добавления отдельных строк, а затем добавил этот курсор в свой ListView.Проблемы с MatrixCursor

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

ответ

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^