2011-12-24 47 views
3

如果聯繫人有多個號碼,我必須爲同一聯繫人創建一個帶有多行的ListView。因此具有3個數字的聯繫人將在ListView中顯示爲3個單獨的行。爲此我創建了一個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();關閉光標,釋放其所有資源並使其完全無效。你必須重新分配內存,使用新的再次使用它。這對我有效。