IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

Répertoire téléphonique classé par ordre alphabétique avec cursor (lent)


Sujet :

Android

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2014
    Messages : 66
    Points : 33
    Points
    33
    Par défaut Répertoire téléphonique classé par ordre alphabétique avec cursor (lent)
    Bonjour à tous,

    je fais un repertoire telephonique en utilisant les cursors et j'ai un resultat qui affiche les noms mais plusieurs problèemes :
    1- les noms ne sont pas affichés par ordre alphabétique dans mon résultat (en passant par un adapter)
    2- le cursor est très lent car probablement j'ai pleins de contacts qui apparraissent de manières multiples(en triple,en quadruple...., pleins d'occurences pour certains contacts. )





    et j'ai deux questions subsidiaires. Premièrement comment avoir les lettres à droite pour un accès rapide aux contacts? Deuxièmement comment faire avec mon code source (ci dessous) quand j'ai plusieurs numéros pour un seul et même contact.


    Merci



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    package com.example.rc;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import android.app.Activity;
    import android.os.Bundle;
    import android.provider.ContactsContract;
    import android.widget.ListView;
     
    public class MainnActivity extends Activity {
    	TextView f=null;
    	ListView vue;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            List<String []> laliste=new ArrayList<String[]>() ;
            vue =(ListView) findViewById(R.id.listView);
            android.database.Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
     
             String nom ="";
             String n ="";
             String num ="";
             int id ;int idIdx;
             int detectnum;
             while (cursor.moveToNext()){
                 idIdx = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                 detectnum=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                 if (detectnum>=1){
                 android.database.Cursor cursor2 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+idIdx, null, null);
     
                while (cursor2.moveToNext()){
                    nom=cursor2.getString(cursor2.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    int numero2=cursor2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
            	num=num+cursor2.getString(numero2);}	
                }
     
                 String[] repertoir={nom,num};
     
                 laliste.add(repertoir);
     
             }
     
             	RepertoireAdapter a=new RepertoireAdapter(this,laliste);
             	vue.setAdapter(a);
     
     		cursor.close();
     
        }
    }

  2. #2
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Pour les trier par nom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android.database.Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME);

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2014
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Merci Héphaistos pour ta réponse! C'est trié par nom maintenant.

    Mais j'ai toujours le problème des occurences multiples pour les contacts (j'ai certains de mes contacts en double, triple ou même en quadruple.... alors que quand je vois avec mon répertoire normal de telephone, ils n'apparaissent qu'une fois).
    En plus, ce problème ralentit beaucoup l'appli.


    Quelqu'un saurait au regard de mon code source?

  4. #4
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    A tout hasard, tu peux tenter d'éliminer les doublons ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    android.database.Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, new String[]{"DISTINCT "+ContactsContract.Contacts._ID, ContactsContract.Contacts.HAS_PHONE_NUMBER}, null, null, ContactsContract.Contacts.DISPLAY_NAME);

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2014
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    J ai poste un peu vite, en fait j ai des doublons en plus sur mes derniers contacts. Les autres doublons sont presents aussi dans le repertoire habituel du telephone. Ce qui constitue une sorte de bug pas traite par ce repertoire et qui ralentit beaucoup mon appli : j ai 700 contacts dont la majorite sont en triple ou en quadruple et mon appli mets 15secondes pour s ouvrir.

    J ai essaye de rajouter ,pour essayer,cursor2.close() mais ca n acclere pas.

    Donc le probleme est bien de supprimer les doublons directement avec le cursor comme on m a conseille. En effet, j ai rajoute par l intermediaire d un vector un test if contains(nom) sur un vector des noms incremente des noms trouve par le cursor mais bien logiquement ca ne vas pas plus vite. Confirmation donc qu il faut plutot eliminer les doublons avec le vector.

    Malheureusement le distinct qu on m a conseille doit etre "incomplet" ou pas bien place.
    Je me dis qu il faut faire un truc dans le genre mais precisemment?

    Ta seconde reponse mr Hephaistos007 donne "invalid column DISTINCT ID

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2014
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    "Confirmation donc qu il les enlever avec" le CURSOR.... et non pas avec le vector .., bien logiquement


    mais comment

  7. #7
    Expert confirmé
    Avatar de Hephaistos007
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Décembre 2004
    Messages
    2 493
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 493
    Points : 4 166
    Points
    4 166
    Par défaut
    Visiblement il est impossible d'éliminer les doublons avec la méthode query() d'un ContentProvider, qui n'est pas exactement la même que celle de SQLLite. Puisque le mal est fait, il reste à éliminer les doublons dans la liste, avant de la passer à ton adapter. Peut-être le plus simple est de transvaser le contenu de ta liste (interface List) dans un ensemble (interface Set) puis de faire l'opération inverse : en effet, un ensemble est prévu pour préserver l'invariant "pas de doublons". Inspires toi de ce code :
    Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ArrayList list = new ArrayList() ;
    Set set = new HashSet() ;
    set.addAll(list) ;
    ArrayList distinctList = new ArrayList(set)

    Sinon il faudra le coder manuellement.

    Dans tous les cas, ces traitements ralentissent encore un peu plus ton programme.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2014
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    Peut etre que si j utilise une table de hachage ,hashmap ou hashlist si je me rappelle bien, ca accelera l appli non?

    Je vais laisser tomber les doublons certainement...

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2014
    Messages : 66
    Points : 33
    Points
    33
    Par défaut
    J ai resolu le probleme de lenteur. C etait une histoire de projection.

    Mais j ai toujours le probleme de l acces rapide aux contacts avec des lettres a droite de l ecran par exemple. Pour aboutir sur le contact jeremie par exemple, il faudrait cliquer sur le "j" pour aboutir sur les contacts commencant par un "j". Ca passerait ,j imagine, par un framelayout... mais a part cette idee, je ne vois pas comment concretement je peux avoir l acces rapide aux prenoms commencant par une certaine lettre

Discussions similaires

  1. Menu classé par ordre alphabétique
    Par trikker dans le forum WordPress
    Réponses: 0
    Dernier message: 16/05/2010, 18h09
  2. Récupérer les données par ordre alphabétique avec GET
    Par thebarbarius dans le forum Langage
    Réponses: 4
    Dernier message: 04/03/2010, 14h42
  3. tri d'un répertoire par type et non par ordre alphabétique
    Par panach91 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 12/02/2008, 10h02
  4. Réponses: 23
    Dernier message: 18/05/2007, 09h21
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 08h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo