2011-12-24 18 views
3

連絡先に複数の番号がある場合、同じ連絡先に対して複数の行を持つListViewを作成する必要があります。したがって、3つの数字を持つ連絡先は、ListViewに3つの別々の行として表示されます。そのために私は別の行を追加してListViewにこのカーソルを追加するためにMatrixCursorを作成しました。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() 

機能ので、連絡先のデータは、私が作成し続ける場合、私は再びこの関数を呼び出す必要がありますし、変更された場合:すべてのrequeryため

new MatrixCursor(); 

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

答えて

0

documentaionから、mCursor.close();カーソルを閉じて、すべてのリソースを解放し、完全に無効にします。新しいものを使用してメモリを再割り当てする必要があります。それは私のために働いた。