2017-09-12 2 views
1

Im obtenir montrant des contacts sur un RecyclerView et au-dessous du code extraient contactsmontrant des contacts en filtrant ACCOUNT_TYPE colonne de RawContacts

Uri Contact_URI=ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 


      return new CursorLoader(getActivity(),Contact_URI,null,null,null,Build.VERSION.SDK_INT 
        >= Build.VERSION_CODES.HONEYCOMB ? 
        ContactsContract.Contacts.DISPLAY_NAME_PRIMARY : 
        ContactsContract.Contacts.DISPLAY_NAME+ "ASC"); 

mais certains contacts sont représentés plusieurs fois alors j'ai décidé de filtrer les contacts sur la colonne account_type. Ci-dessous, le filtre de code basé sur account_type

if(list.getString(list.getColumnIndex("account_type")).equals("Local Phone Account") || list.getString(list.getColumnIndex("account_type")).equals("SIM Account")) { 

      textView.setText(list.getString(list.getColumnIndex(Build.VERSION.SDK_INT 
        >= Build.VERSION_CODES.HONEYCOMB ? 
        ContactsContract.Contacts.DISPLAY_NAME_PRIMARY : 
        ContactsContract.Contacts.DISPLAY_NAME))); 
      number.setText(list.getString(list.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); 
     number.setText(list.getString(list.getColumnIndex("account_type"))); 

     } 

problème est de account_type valeurs pour les contacts SIM et du téléphone varie d'un appareil à. En Samsung GT-l9082 donne des valeurs pour sim « compte Sim » et pour le téléphone « compte de téléphone local » mais quand je l'ai testé sur Galaxy J5 il montre des valeurs différentes contre account_type pour contacts.I sim et téléphone veulent afficher uniquement Sim et contacts du téléphone

Répondre

1

Ce n'est pas le chemin à parcourir.

CommonDataKinds.Phone.CONTENT_URI est un tableau de tous les téléphones dans le DB de contacts, pas de contacts. Ainsi, même si vous ne filtrez qu'un seul compte, si un contact contient plus d'un téléphone, il apparaîtra deux fois dans votre liste.

Si vous souhaitez afficher une seule ligne par contact, mais que vous devez toujours afficher un téléphone dans votre liste principale, vous ne pouvez pas utiliser le paradigme CursorLoader (ce qui est vraiment nul et je ne l'utiliserais pas).

courir au lieu d'une simple requête pour tous les éléments de la table Phones.CONTENT_URI, et créer un HashMap de CONTACT_ID à une liste de NUMBER s, puis afficher une ligne par élément de la carte, et vous aurez accès à cette liste des téléphones du contact ainsi pour l'affichage.

Map<String, List<String>> contacts = new HashMap<String, List<String>>(); 

String[] projection = { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER }; 
Cursor cur = cr.query(Phone.CONTENT_URI, projection, null, null, null); 

while (cur != null && cur.moveToNext()) { 
    long id = cur.getLong(0); 
    String name = cur.getString(1); 
    String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234 

    Log.d(TAG, "got " + id + ", " + name + ", " + data); 

    // add info to existing list if this contact-id was already found, or create a new list in case it's new 
    String key = id + " - " + name; 
    List<String> infos; 
    if (contacts.containsKey(key)) { 
     infos = contacts.get(key); 
    } else { 
     infos = new ArrayList<String>(); 
     contacts.put(key, infos); 
    } 
    infos.add(data); 
} 

// now you can iterate over the 'contacts' map to display all contacts 
+0

Merci pour votre réponse. J'ai aussi pensé à filtrer les contacts mais 'CursorLoader' renvoie un' Cursor' et 'CursorLoader.query()' s'exécute sur le thread NON-UI. donc ça n'a pas d'importance. Bien, je suis d'accord sur l'utilisation de HashMaps. Je l'accepte comme réponse –

+0

Vous pouvez exécuter la requête et construire le HashMap sur un thread non-UI vous-même (en utilisant un Thread), puis passer le HashMap à un adaptateur pour afficher les données à l'écran – marmor

+0

Je n'ai récupéré que les numéros de téléphone interroger directement 'ContactsContract.Data' et filtrer sur' Data.MIMTYPE = Phone.CONTENT_ITEM_TYPE '. il ne me donne que les numéros de téléphone des contacts, qu'ils appartiennent à SIM ou Phone ou à un compte Email –