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

Composants graphiques Android Discussion :

Découverte et utilisation du composant ListView [Tutoriel]


Sujet :

Composants graphiques Android

  1. #1
    Membre confirmé

    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 596
    Points
    596
    Par défaut Découverte et utilisation du composant ListView
    Bonjour,

    Je vous propose un tutoriel sur présentation le composant ListView sur Android.
    Vous y trouverez les premiers concepts à maitriser pour bien utiliser et comprendre les composants gérant les listes d'items.

    http://mickael-lt.developpez.com/tut...iser-listview/

    N'hésitez pas à laisser vos commentaires ici.
    Merci d'avance.

  2. #2
    Membre confirmé

    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2005
    Messages : 464
    Points : 646
    Points
    646
    Par défaut
    Merci pour ce beau tutoriel Android .
    Voici mes commentaires.

    Présentation
    De manière générale indiquer les pré-requis pour ne pas recevoir des questions auxquelles tu n'as pas forcément envie de répondre.
    Donner également les outils que tu utilises : ici Eclipse + le SDK*Android.


    II-A. Affichage avec une ListActivity

    2.1 est la version de la plateforme.
    La version du SDK*est le no API que tu retrouves dans la description de la cible.
    Travailler sur la version 2.1 c bien mais aussi pas bien car je ne connais qu'un seul téléphone en dehors du Nexus qui l'héberge (Motorola MileStone). Le plus répandu doit être le 1.5 voir 1.6. C'est triste mais les fabricants sont fainéants pour la procédure de maj.

    "Une chose importante à ce niveau là est l'identifiant du composant ListView : "@android:id/list". Ici on ne peut pas mettre un identifiant personnel comme on peut le faire pour les autres composants,"

    Tu pourrais donner un ou deux exemples de composant avec un ID*"personnalisé" ?

    http://developer.android.com/guide/t...rces-i18n.html
    Le '@' indique que nous allons utiliser une 'référence' de ressource.
    android: indique qu'il s'agit d'une ressource faisant partie du package android.
    id : indique qu'il s'agit d'une ressource de type identifiant.
    list : c'est la référénce vers cet identifiant.

    En une phrase on demande à Android de nous générer un ID*pour cette ressource qui sera référencé par list.


    Initialisation mStrings.
    Je suis tout jeune en java ( < 1 sem), mais qu'est-ce que le contenu de mStrings peut-être modifié ?
    l'utilisation des mots clés static et final n'est-elle pas nécessaire ?


    Est-ce toi qui a crée le layout simple_list_item_1 ?
    Je pensais que ce serait main puisque tu as crée le listview dedans ?

    II-B. Affichage sans ListActivity
    Après avoir passer les données au composant listView il faut indiquer que c'est cette vue qu'il faut afficher ?
    Bon je pourrais toujours fouiller dans les sources, mais bon tu l'expliques dans le premier exemple et pas celui-là.

    Pour le reste, ben je suis en train de le lire plus profondément ....

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Merci pour ce tuto !

    Par contre, j'aurais une petite question :

    La prochaine méthode permet de prévenir tous les listeners en même temps pour diffuser une information :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private void sendListener(Personne item, int position) {
        for(int i = mListListener.size()-1; i >= 0; i--) {
        	mListListener.get(i).onClickNom(item, position);
        }
    }
    Pourquoi prévenir tous les listeners en mêmes temps ? Car cette fonction va déclencher le OnClickNom pour chaque item ?

  4. #4
    Membre confirmé

    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 596
    Points
    596
    Par défaut
    Bonjour, et merci à vous deux pour vos retours.
    Alors je vais répondre dans l'ordre :
    pourquoi utiliser la 2.1
    Dans le cadre de cet exemple, la version du SDK était vraiment facultative. Comme tu pourras le remarquer, il s'agit ici d'un exemple simple permettant d'appréhender certain mécanisme d'Android.
    Et puis, si je voulais est titilleux, je te dirais que depuis peu, la version 2.1 est la plus répandu (cf http://developer.android.com/resourc...-versions.html )

    exemple d'id personnel
    Il y a un exemple un peu plus bas, donc j'ai pas jugé nécessaire de faire un comparatif là, mais c'est vrai, pourquoi pas. Si j'ai le temps dans les prochains jours, je ferais une rapide mise à jours.

    De même, je ne me suis pas étalé sur une vraie description de l'id pour la liste car je n'ai pas trouvé de description simple et basique, sans aller plus loin. Peut être que prochainement je ferais un autre tutoriel pour reprendre les concept sur Android. A voir si c'est beaucoup demandé.

    La tableau de String doit-il est en "const final"
    Oui, je pense qu'il aurait été plus judicieux de le typer ainsi. Je ferais la correction. Mais là, c'est plus de l'optimisation de code qu'autre chose. (enfin je crois ^^)

    Est-ce toi qui a crée le layout simple_list_item_1 ?
    Je le précise dans le paragraphe suivant : "Le deuxième paramètre "android.R.layout.simple_list_item_1" permet d'indiquer la présentation utilisée pour les items de notre liste. Ici il s'agit d'une présentation simple pour les chaines de caractères incluse dans le SDK. " C'est donc un layout fourni avec le SDK (tel que l'indique le android.R), ce n'est pas moi qui l'ai créé.

    Après avoir passer les données au composant listView il faut indiquer que c'est cette vue qu'il faut afficher ?
    Bon je pourrais toujours fouiller dans les sources, mais bon tu l'expliques dans le premier exemple et pas celui-là.
    Oui, j'ai pas de meilleur réponse Vu que je l'explique déjà plus haut, je me suis permis de penser qu'il était inutile de le répéter ici.

    Pour le reste, ben je suis en train de le lire plus profondément ....
    Pas de soucis, n'hésites pas si tu as d'autres remarques.


    Pourquoi prévenir tous les listeners en mêmes temps ? Car cette fonction va déclencher le OnClickNom pour chaque item ?
    Oui ça va prévenir tous les listeners qui veulent savoir si il y a un click sur la liste, que y'a eu un click sur la liste
    Ici dans l'exemple, notre Activité principale s'ajoute en tant que listener sur la liste.
    Ainsi si on clique sur un item de la liste, notre activité principale peut traiter l'information et en faire ce qu'elle veut.
    Mais on peut également imaginer que pour un autre type de besoin, on ai besoin deux listeners pour écouter ce qu'il se passe sur la liste. Et là pareil, à chaque sélection d'un item, nos listeners seront au courant de la sélection.
    Je sais pas si c'est plus claire ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Oui et non.

    Je débute en java et en android et je pense que j'ai du mal à assimiler / visualiser certains objets. L'application que je développe actuellement utilise une listview, donc ton tuto tombe à pic

    Je pensais que la fonction serait déclenché autant de fois qu'il y a d'item dans la listview

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Bonsoir,

    J'ai branché le setOnLongClickListener() et le setOnClickListener() directement sur mon layoutItem pour que le click soit déclenché sur tout l'item voulu.

    Tout fonctionne très bien mais une fois le click branché, l'item clické ne se sélectionne plus (la surbrillance bleu par exemple que l'on a par défaut ne n'apparaît plus).

    Est ce que quelqu'un sait comment faire pour avoir toujours une surbrillance dès qu'un item est sélectionné avec le doigt sur l'écran tactile ?

    En cherchant un peu j'ai vu que l'on pouvait appeler un évènement, de cette manière je peux changer la couleur de fond (mais c'est moche, il y a plus l'effet de surbrillance ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    llLayoutItem.setFocusable(false);
    llLayoutItem.setFocusableInTouchMode(true);
     
    llLayoutItem.setOnFocusChangeListener(new OnFocusChangeListener(){
    	public void onFocusChange(View v, boolean hasFocus)
    	{
    		v.setBackgroundColor(hasFocus ? Color.RED : Color.BLACK);
    	}
    });
    Merci d'avance

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Personne a déjà eu ce " problème " ?

    Je suppose que j'ai surement oublié quelque chose de vraiment " simple " mais... je ne vois pas du tout

    Comme dit plus haut, le setBackgroundColor() est vraiment moche, donc je pense qu'il doit y avoir la " surbrillance " par défaut a réactiver ?

  8. #8
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Salut,

    Vu que tu n'as pas besoin d'un listener spécifique sur un objet dans ton item, mais juste de savoir si une ligne est touchée, tu peux également rajouter un simple listener sur ton objet listview :

    http://developer.android.com/referen...ickListener%29
    A partir de là, tu pourras peut être retrouver un comportement normal sur la surbrillance de ton item.
    Si je n'ai pas été clair, n'hésites pas à redemander des informations

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Bonsoir,

    Je te remercie de ta réponse. Je débute un peu (que ce soit en java ou android) donc oui je veux bien un peu plus de précisions stp

    D'après ce que j'ai compris, un listener, c'est ce qui permet de gérer/écouter les évènements sur ma listview.

    Voici mon code qui ajoute le listener (de base ?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cLvInfoSearch InfoSrcAdapter = new cLvInfoSearch(SearchName.this, alInfoSearch);
    InfoSrcAdapter.addListener(SearchName.this);
     
    ListView lvSrc = (ListView)findViewById(R.id.lvSearchLicence);
    lvSrc.setAdapter(InfoSrcAdapter);
    J'ai suivi le tuto, cLvInfoSearch est ma classe qui hérite d'un BaseAdapter. SearchName correspondant à ma classe en cours (cette partie de code étant dans un thread : j'utilise un thread pour afficher un loading en attendant la récupération des données)

    C'est dans la méthode cLvInfoSearch.GetView() que j'ai défini les setOnClickListener() et setOnLongClickListener().

    Je ne vois pas comment ajouter un nouveau listener sur ma ListView. Tu voulais dire par exemple (c'est ce que j'ai essayé mais qui ne marche pas; ainsi que le OnItemSelectedListener) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    lvSrc.setOnItemClickListener(new OnItemClickListener() {
    	@Override
    	public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
    	// TODO Auto-generated method stub				
    	}
    });
    ---
    Mon ListView (xml)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <ListView android:id="@+id/lvSearchLicence"
    	android:layout_width="fill_parent" android:layout_height="fill_parent"
    	android:divider="@color/lv_divider" android:dividerHeight="1px" 
    	android:cacheColorHint="#00000000" android:background="@color/lv_background"/>
    J'ai vu que l'on pouvait également lui rajouter les attribut suivants mais sans effet (mon contexte ne correspond peut être pas)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    android:focusable="true" android:focusableInTouchMode="true"
    Ainsi que le android:choiceMode, mais si j'ai bien compris, dans mon cas je ne dois pas m'en préoccuper vu que je ne peux avoir qu'un seul click par item.

  10. #10
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    Oui c'est à peu près ça.
    Dans ta classe principale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    cLvInfoSearch InfoSrcAdapter = new cLvInfoSearch(SearchName.this, alInfoSearch);
    //InfoSrcAdapter.addListener(SearchName.this); //On supprime ce listener
     
    ListView lvSrc = (ListView)findViewById(R.id.lvSearchLicence);
    lvSrc.setAdapter(InfoSrcAdapter);
    //On ajoute ce listener
    lvSrc.setOnItemClickListener(new OnItemClickListener() {
    	@Override
    	public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
    	// TODO Auto-generated method stub				
    	}
    });
    Et comme ça, ça ne fonctionne pas ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Non, cela ne fonctionne pas. Le traitement ne passe jamais dans le onItemClick().

    Je suis un peu perdu, j'ai essayé de chercher sur internet mais je n'ai rien trouvé de similaire (seulement le problème pour déclencher plusieurs click différent au sein du même item).

    Il semblerait que l'on puisse utiliser un ArrayAdapter. Je vais peut être essayer de ce côté là, je ne vois pas la différence avec un BaseAdapter par contre.

  12. #12
    Membre confirmé

    Inscrit en
    Mars 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 4
    Points : 596
    Points
    596
    Par défaut
    Salut,

    Si tu le souhaites, tu peux m'envoyer ton code par MP, je pourrais le regarder si tu veux(et si il n'y a rien de confidentiel), afin de voir si je trouve la solution.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Ok je te remercie. Je suis pas sur le bon ordi, j'essaye de t'envoyer le code quand je pourrais.

    Par contre, toi, tu n'as pas rencontré ce problème là ? Même en mettant le setTag() et le setOnClickListener() sur le textView tvNom ?

    En faisant de cette manière, lors du click sur le tvNom, le code correspondant est déclenché mais pas la surbrillance. Mais en cliquant dans mon item (ailleurs du tvNom), la surbrillance fonctionne sans le code du click bien entendu.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    J'ai enfin réussi a retrouver le comportement de base ^^

    MrDuChnok tu avais raison , il fallait bien rajouter un setOnItemClickListener() La dernière fois, cela n'avait pas marché, pourquoi je ne sais pas trop^^

    En fait, j'ai repris quasiment de zéro car en faisant la DvpList2 de base j'avais le même soucis. J'ai donc enlevé l'interface de ma classe qui héritait de BaseAdapter ainsi que tout ce qui correspondait à l'ancien listener.

    Grâce à mon ArrayList de mon objet (alInfoSearch), et avec la position je peux récupérer les valeurs que je souhaite.

    Merci à vous

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 29
    Points : 42
    Points
    42
    Par défaut
    Bonjour tout le monde !!

    Alors voila, j'ai une question, comment peut-on faire pour que le clic de l'utilisateur soit pris en compte sur la ligne qui contient le texte et pas que sur le texte lui-même.

    J'ai lu un peu ce qu'a posté Shinryu, et ça a l'air de rejoindre ce que je cherche mais... j'ai pas tout compris

    Donc si quelqu'un pouvait m'aider ... ce serait cool !!! merci !

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Bonsoir,

    Si tu as utilisé le tuto, au lieu de mettre le setOnClickListener() sur le TextView Nom, tu le branches sur la view correspondante (ici le layoutItem) ainsi que le setTag().

    Après tu souhaites peut être avoir le fonctionnement de base ?

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 29
    Points : 42
    Points
    42
    Par défaut
    Bonjour,

    En ce qui concerne ta solution, ça marche (par contre il faut pas oublier de passer tous ses éléments en "android:layout_width="fill_parent"" dans ses fichiers xml). Par contre je n'ai toujours pas la surbrillance (c'est moins beau donc) et j'aimerai bien qu'elle soit active si c'est possible. Tu parles de rajouter un setOnItemClickListener, ou faut-il le mettre, et surtout, peut-on l'utiliser sans utiliser de listActivity ?

    En tout cas merci pour l'aide.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 22
    Points : 20
    Points
    20
    Par défaut
    Oui cela fonctionne sans un ListActivity

    En fait, dans ta classe BaseAdapter :
    - suppression de la gestion du click dans la fonction getView()
    - suppression de la gestion des évenements (suppression de l'interface, de la gestion du listener)

    Dans ta classe Principale :
    - plus besoin d'implémenter l'interface (supprime les fonctions liées à cette interface)
    - tu rajoutes la gestion du click juste après la récupération de ta ListView

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PersonneAdapter adapter = new PersonneAdapter(this, listP);
     
    ListView list = (ListView)findViewById(R.id.ListView01);
    list .setOnItemClickListener(new OnItemClickListener() {
    	@Override
    	public void onItemClick(AdapterView<?> parent, View view, int position,
    		long id) {
    		// Ton traitement souhaité lors du click,
                    // la variable position est en fait l'indice de l'item cliqué 
                    //à partir de là tu peux récupérer l'objet souhaité de ton tableau
    	}
    });
    list.setAdapter(adapter);
    J'ai repris le code du tuto, en espérant avoir répondu à ta question, si jamais tu as des soucis, n'hésite pas

    Il est surement possible d'utiliser la gestion du listener dans la classe héritant de BaseAdapter tout en gardant l'affichage / gestion de base de la ListView, mais je n'ai pas trouvé.

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 29
    Points : 42
    Points
    42
    Par défaut
    OK, merci beaucoup, avec ça, ce sera parfait.

  20. #20
    Membre du Club Avatar de lord anubis
    Inscrit en
    Février 2006
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Février 2006
    Messages : 114
    Points : 59
    Points
    59
    Par défaut
    Juste pour dire merci pour ce tuto.
    Extrêmement pratique, et qui me sauve plus ou moins la vie pour ce que je suis en train de faire en stage .

    Encore merci.

    ++

Discussions similaires

  1. [SGBD][ADO] Utilisation des composants ADO
    Par Teb dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 22/08/2005, 15h33
  2. utilisation des composants d'aide à la décision
    Par karim2005 dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/07/2005, 13h36
  3. Utilisation du composant TDBImage
    Par kkv dans le forum Bases de données
    Réponses: 4
    Dernier message: 10/03/2005, 17h41
  4. [][Timer] Créer un Timer sans utiliser le composant
    Par HPJ dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 01/10/2003, 11h04

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