2015-08-29 2 views
0

Я хочу сортировать контакты, когда они выбраны, и я даю инструкции заказ по имени контакта, но ничего не работает.Сортировка контактов по контактному имени

Это мои коды

public static TreeMap<String, String> getContactsMobileNumbersAndNames(Context context) { 
    TreeMap<String, String> result = new TreeMap<>(); 
    ContentResolver cr = context.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, 
      null, null, null, null); 
    if (cur.getCount() > 0) { 
     while (cur.moveToNext()) { 
      String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
      String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
      if (Integer.parseInt(cur.getString(
        cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) { 
       Cursor pCur = cr.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
         new String[]{id}, null); 
       while (pCur.moveToNext()) { 
        int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 
        if (phoneType == ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE) { 
         String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         result.put(phoneNo, name); 
        } 
       } 
       pCur.close(); 
      } 
     } 
    } 
    cur.close(); 
    return result; 
} 
+0

Проверьте это [ссылка] (http://androhub.com/android-read-contacts-using-content-provider/). –

ответ

0

TreeMap является карта, которая сортируется в соответствии с естественным порядком его ключей по умолчанию. Вы пытались сортировать контакты в соответствии с номерами телефонов. Таким образом, если хотят работать ваш код, вам необходимо изменить эту строку:

result.put(phoneNo, name); 

с этой линией:

result.put(name, phoneNo); 

Кроме того, вы можете получить отсортированные контакты без использования TreeMap следующим образом:

ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>(); 


public void retrieveContactList() { 

    Cursor phones = null; 

    try { 
     phones = activity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"); 
     while (phones.moveToNext()) 
     { 
      String _number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)).replaceAll("\\s+", ""); 
      String _name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 

      HashMap<String, String> contact = new HashMap<String, String>(); 
      contact.put("NUMBER", _number); 
      contact.put("NAME", _name); 
      contactList.add(contact); 
     } 

     phones.close(); 

    } catch (Exception e) {} 

    finally { 
     if(phones != null){ 
      phones.close(); 
     } 
    } 
} 

public void printContacts() { 

    for (int i = 0; i < contactList.size(); i++) { 
     Log.v(contactList.get(i).get("NAME"), contactList.get(i).get("NUMBER")); 
    } 
} 

Однако, если вы настаиваете на использовании карты, нет необходимости получать контакты в отсортированном порядке. Поместите их в HashMap (ключ номер и значение имени) в методе геттера, а затем, во время чтения ключей и значений, передать все содержимое из HashMap в TreeMap:

treeMap.putAll(hashMap); 

Теперь вы можете распечатать содержимое в отсортированный порядок.

+0

Я не могу поместить на карту имя контакта из-за дублирования контактов. Он заменяет другой. – Alireza

+0

Вам необходимо использовать ArrayList > в качестве структуры данных для хранения контактов. Я отредактировал свой ответ, не могли бы вы проверить его? –

Смежные вопросы