連絡先に複数の番号がある場合、同じ連絡先に対して複数の行を持つ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件の連絡先がある場合、このカーソルにはアプリケーションのクラッシュを引き起こす多くのメモリが必要です。このようなリストを表示する他の方法はありますか?