Search code examples
androidandroid-contentproviderandroid-contactsandroid-contentresolver

Android: Contact list has duplicate names


I have a contact list in a sort order. But in my contact list the name is duplicating with same number. I think the issue is because of the contact list sync with different account.

I check with Hash map. But when I using hash map the result is not sorted with name .

private static final String[] PROJECTION = new String[] {
    ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.CommonDataKinds.Phone.NUMBER
};

ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION,
  null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " COLLATE NOCASE ASC");

if (cursor != null) {
    try {
        int nameIndex = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
        String nameContact = cursor.getString(nameIndex);
    finally {
        cursor.close();
    }
}

Adapter

holder.name.setText(itemListPogo.get(position).getItemName());

Can anyone please help to avoid the duplication in name.


Solution

  • I will recommend you to use where my searching ends, it will give you fastest result.

    public static List<ContactDTO> getPhone(Context context) {
        List<ContactDTO> contactList = new ArrayList<ContactDTO>();
        ContentResolver cr = context.getContentResolver(); 
        String[] PROJECTION = new String[] { 
            ContactsContract.RawContacts._ID, 
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.PHOTO_URI,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
    
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String filter = ""+ ContactsContract.Contacts.HAS_PHONE_NUMBER + " > 0 and " + Phone.TYPE +"=" + Phone.TYPE_MOBILE;     
        String order = ContactsContract.Contacts.DISPLAY_NAME + " ASC";// LIMIT " + limit + " offset " + lastId + "";
    
        Cursor phoneCur = cr.query(uri, PROJECTION, filter, null, order);
        while(phoneCur.moveToNext()) {
            ContactDTO dto = new ContactDTO();
            dto.setName("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
            dto.setMobileNo("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
            dto.setPhotoUrl("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI)));
            dto.setContactId("" + phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Photo.CONTACT_ID)));
            contactList.add(dto);
        }
        phoneCur.close();
    
        return contactList;
    } 
    

    where ContactDTO is Simple POJO class.