How to display contact name and number sorted by address in android studio

Viewed 177

I have to display contact name and number in recycler view. But, the sorting order should be by address which means that if a contact has address saved with it, then it should be displayed in first place in recycler view, then followed by the contacts which don't have addresses. All the code is working. I don't know how to sort by address and then display it in recycler view.

Code is: public void getContactList() {

    Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME;

    ContentResolver resolver = getContentResolver();

    Cursor cursor = resolver.query(phoneUri, null, null, null, sortOrder);

    if (cursor.getCount() > 0) {
        while (cursor.moveToNext()) {

            contact= new Contact();
            contact.setName(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)));
            contact.setNumber(cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER)));
            contact.setContactId(cursor.getLong(cursor.getColumnIndexOrThrow(ContactsContract.Data.CONTACT_ID)));

            contact.setAddresses(getAddressesByContactId(contact.getContactId()));

            contactList.add(contact);

        }
    }

    cursor.close();


    setContactsRecyclerView();
}

private ArrayList getAddressesByContactId(long contactId) {

    Uri addressUri = ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI;
    String sortOrder = ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS;

    String addressSelection = ContactsContract.Data.CONTACT_ID + "=" + contactId;

    Cursor addressCursor = getContentResolver().query(addressUri, null, addressSelection, null, sortOrder);

    ArrayList<String> addresses = new ArrayList<>();

    if (addressCursor.getCount() >0) {

        while (addressCursor.moveToNext()) {

            addresses.add(addressCursor.getString(addressCursor.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS)));
        }

    }
    addressCursor.close();

    return addresses;
}

private void setContactsRecyclerView() {

    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    recyclerViewAdapter = new RecyclerViewAdapter(this, contactList);

    recyclerView.setAdapter(recyclerViewAdapter);
}
1 Answers

You need to simply sort your contactList before setting it into the recyclerViewAdapter.

Here's an example sort function:

Collections.sort(contactList, new Comparator<Contact>() {
    @Override
    public int compare(Contact a, Contact b) {
        String address1 = (a.getAddresses().isEmpty() ? null : a.getAddresses().get(0);
        String address2 = (b.getAddresses().isEmpty() ? null : b.getAddresses().get(0);

        int addressCompare = StringUtils.compare(address1, address2, false);

        if (addressCompare != 0) {
            return addressCompare;
        }

        return StringUtils.compare(a.getName(), b.getName(), false);
    }
});
Related