Je suggérerais d'utiliser votre vue personnalisée pour les contacts - ce n'est pas vraiment difficile et vous pouvez la personnaliser comme vous le souhaitez. Personnellement, j'ai implémenté de cette manière la fonctionnalité dont vous avez besoin.
Voir ici:
Chaîne PHONE_CONTACTS_ORDER_CLAUSE = ContactsContract.Contacts.DISPLAY_NAME
+ " ASC";
List contacts = new ArrayList(); // J'ai défini le bean PhoneContact
String[] projection = { ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME }; // Choisissez les colonnes dont vous avez besoin
Cursor cursor = this.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, projection, null/* l'endroit pour votre clause where*/, null/* l'endroit pour vos arguments where*/,
PHONE_CONTACTS_ORDER_CLAUSE);
startManagingCursor(cursor);
int contactIdIdx = cursor.getColumnIndex(ContactsContract.Contacts._ID);
int displayNameIdx = cursor
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
while (cursor.moveToNext()) {
PhoneContact contact = new PhoneContact(); // C'est une classe que j'ai définie, utilisez les données comme vous le souhaitez.
contact.setContactId(cursor.getString(contactIdIdx));
contact.setDisplayName(cursor.getString(displayNameIdx));
contacts.add(contact);
}
ÉDITION Désolé, je me suis laissé distraire en écrivant le commentaire : l'identifiant de contact est en fait le lien entre les différents fournisseurs de données liées aux contacts. Voici quelques fournisseurs supplémentaires que vous pouvez utiliser pour voir s'il existe des téléphones ou des e-mails associés au contact :
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
ContactsContract.CommonDataKinds.Email.CONTENT_URI