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 :

Comprendre les button dans les adapters


Sujet :

Android

  1. #1
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut Comprendre les button dans les adapters
    Bonjour,
    Je reviens, encore avec mes connaissances approximatives, demander de l'aide pour comprendre un des principes du dev android.
    A vrai dire, je cherche à créer des évènements dans un élément d'une liste.
    Trouver des tutos parlant d'afficher un message au click, ça c'est facile, trouver un tuto qui montre comment faire fonctionner un bouton dans un élément d'une listview, j'ai pas trouvé mon bonheur.

    J'ai tenté ceci :
    Créer un adapter perso dérivé de SimpleAdapter qui permet de mettre en tag la position de l'élément.
    Onclick (évènement dans le xml de l'adapter), récupéré ce tag, supprimé de ma list qui rempli l'adapter l'élément correspondant.
    notifyDataSetChanged

    Je pense au final que c'est du mauvais bricolage, ça ne fonctionne pas, certains auront sans doute vomis en me lisant. J'aimerais savoir comment faire si ma démarche n'est pas bonne.

    (Il y aura normalement 3 événements pour 3 éléments différents pour chaque élément de ma liste)

    Merci d'avance.
    Expert en recherche google caféinomane

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    Des tutos sur ce que tu cherches, il en existe, notamment ICI

    Je n'ai pas bien compris tous ce que tu as fait, mais je peux te donner la méthode qui a marché pour moi. Les items de ma liste étaient constitués d'un image et d'un bouton.

    Tout d'abord, pour ne pas rendre les items clicquables mais seulement les boutons, j'ai du ajouté ces lignes de codes dans le xml, entre les balises du bouton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            android:focusable="false"
            android:focusableInTouchMode="false"
    Ensuite, dans l'adapter tiré de ce site, j'ai simplement ajouté dans la méthode getView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Button button = ViewHolder.get(convertView, R.id.button);
     
    	    button.setOnClickListener(new OnClickListener() {
    		@Override
    		public void onClick(View v) {
    		    // Actions à effectuer au clic
    		}
    	    });
    J'avais beaucoup galéré, mais au final, ca s'est avéré assez simple. Et on peut facilement relier l'action du bouton à la position de l'item.

  3. #3
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Bonjour,
    J'ai vraiment du mal a saisir le fonctionnement du développement android, au moins pour la gestion d'interface, c'est fou. En même temps, je bosse en vb.net au boulot et j'ai très peu de temps à côté pour tenter des trucs et améliorer mes connaissances, ça explique sans doute mes difficultés.

    Dans l'idée je comprends le lien que tu m'as filé mais pas entièrement, il ne montre pas l'adapter qu'il a utilisé, ou alors j'ai mal compris, et ça bloque ma compréhension. Je me pencherais quand j'aurais un peu plus de temps sur ce qu'il a posté sur github...

    Dans l'attente, je n'ai pas résolu mon problème, je reviendrais quand j'aurais du temps dessus (les vacances sont encore loin @.@)
    Expert en recherche google caféinomane

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    Le problème du tuto, c'est qu'il met tout ensemble, et l'adapter est inclus dans l'activité : "private class AccessoriesAdapter extends BaseAdapter ".

    Pour mes listes, je n'utilise plus que celui donné dans l'autre site, puisque 90% est générique et je ne change quasiment rien. Et pour les boutons, je fais comme dans le tuto, sauf que j'intègre directement le onClickListener, je ne sépare pas la méthode. Ce qui me donne par ex.
    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
    public View getView(final int position, View convertView, ViewGroup parent) {
     
    	if (convertView == null) {
    	    convertView = LayoutInflater.from(activity).inflate(
    		    R.layout.layout_listitem, parent, false);
    	}
     
     
    	Button buttonMechanism = ViewHolder.get(convertView,
    		R.id.buttonMechanism);
     
    	    buttonMechanism.setOnClickListener(new OnClickListener() {
    		@Override
    		public void onClick(View v) {
    		    // Actions à faire au clic
    		}
    	    });
     
    	return convertView;
        }

  5. #5
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Merci, je pense que je saisi de plus prêt comment je dois faire, une fois le week end arrivé je pourrais tester tout ça, en espérant ne pas trop m’emmêler les pinceaux
    Expert en recherche google caféinomane

  6. #6
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Bonjour, j'avance un peu.

    J'ai un adapter que je n'arrive pas a montrer mais qui ressemble a celui que tu m'as montrer... (j'arrive pas a envoyer le message avec le code dans une balise [ code]


    J'ai encore un soucis : j'arrive pas à utiliser le update, quand je lui fais gobber ma list, il me balance "ChoregrapherDoCallBack avec dans le logCat : "No package identifier when getting value for ressource number 0x000.

    Pour update j'ai utilisé cette ligne, directement à la suite de la liaison adapter/list :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Myadapter.updatemanga(Manga);
    Expert en recherche google caféinomane

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    Dis comme ca, j'ai juste incompréhensible.

    Pour ce qui est d'afficher le code, il suffit juste de cliquer sur l'icone # à droite et d'y coller ton bout de code, ou alors sélectionner ton code déjà copié dans ton message et cliquer sur l'icone #. Et pour le message d'erreur, c'est l'icone à coté.

    Pour l'update, de ce que j'ai pu comprendre, c'est que tu as créé une fonction update dans ton adapter pour mettre à jour ta liste quand un nouveau manga est rentré. Et ca, c'est pas bon du tout. L'adapter sert à afficher correctement une liste. Si tu veux rentrer un nouveau manga dans ta liste, c'est ta liste elle-meme qu'il faut updater.

  8. #8
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Je sais rajouter du code dans un message ^^ mais quand je le faisais je n'arrivais pas a envoyer le message, je suspect que mon message était trop long, donc j'ai fais comme j'ai pu ...
    Essayons de le mettre ici...

    toujours une erreur à l'envoi du formulaire u_u, en fichier texte :

    J'ai une classe update dans mon adapter, qui est construit sous la même forme que le deuxième lien que tu m'avais proposé, l'erreur arrive quand le programme tente d'executer le notifydatasetchanged.
    Fichiers attachés Fichiers attachés
    Expert en recherche google caféinomane

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    Pour mon utilisation, j'avais viré cette méthode donc je ne m'en rappelais plus.

    Avant de corriger l'erreur, plusieurs points à noter :
    - meme si dans un lien tout était compris, crée une class pour ton adapter et sépare le de ton activité. Ca sera plus facile à gérer par la suite.
    - tu as oublié une class importante de l'adapter, la classe ViewHolder. Elle évite une consommation de la mémoire en sauvegardant temporairement les items déjà affichés. Au lieu de les recréer, elle les réutilise. J'ai repris ce qui est tout en bas du 2e site, et ca simplifie énormément.

    Pour ce qui est de ton problème, peut-etre l'oubli de this :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     public void updatemanga(List<ItemManga> ItemManga) {
                this.malist = ItemManga;
                notifyDataSetChanged();
            }
    Je ne suis que débutant en android, donc je peux me tromper, mais sinon tu pourras trouver une aide aussi dans cette réponse.

  10. #10
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Merci pour ton aide, même en étant débutant, tu m'orientes bien.

    Je comprends mal un truc : il suffit de créer une liste dans ta classe baseadapter pour qu'il s'en serve pour remplir ma listview correctement ?

    Sinon ça ne fonctionne toujours pas. En débug, voici ce qu'il m'affiche concernant notifyDataSetChanged :
    Nom : 24697660a4.png
Affichages : 183
Taille : 7,5 Ko
    Expert en recherche google caféinomane

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    Normalement, le message d'erreur est plus long, c'est un ensemble de 10-15 lignes environ (ca dépend des erreurs), écrites en rouge.

    Je n'avais pas bien lu ton code, mais normalement, on remplit la liste avant de l'afficher, soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     mylist = (ListView) findViewById(R.id.mylist);
            ItemManga Manga1 = new ItemManga("FMA");
            Manga.add(Manga1);
            Myadapter Myadapter = new Myadapter(this);
            mylist.setAdapter(Myadapter);
    La fonction update, comme dans la solution que j'ai mentionnée avant, c'est juste pour rajouter des items après, suite à une action de l'utilisateur par ex.

    Dans mon cas, je rentre la liste remplie dans le constructeur de l'adapter :
    Myadapter Myadapter = new Myadapter(this, maListe);

    ce qui me permet de la récupérer ensuite dans l'adapter pour l'afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MonAdapter extends BaseAdapter {
     
        private ArrayList<String> listeAdapter;
        private final Context context;
     
        public MonAdapter(Context context,
    	    ArrayList<String> maListe) {
    	super();
    	this.context = context;
    	this.listeAdapter= maListe;
        }

  12. #12
    Membre expérimenté Avatar de Uranne-jimmy
    Homme Profil pro
    Bioinformatique
    Inscrit en
    Décembre 2012
    Messages
    778
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Bioinformatique
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 778
    Points : 1 461
    Points
    1 461
    Par défaut
    Problème réglé :)

    J'ai fait ce que tu m'as dit : diviser l'adapter pour plus de lisibilité dans une classe à part, rajouter le viewHolder.

    Mais le soucis venait à vrai pas de là mais de ma façon de faire gobber les infos à mes view. sur cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Num.setText(ItemManga.num);
    Sachant que ItemManga.num est un integer. C'est réglé ^^

    Merci beaucoup, je me sens soulagé.
    Expert en recherche google caféinomane

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2012
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 475
    Points : 587
    Points
    587
    Par défaut
    Y a pas de quoi. Au début, j'avais beaucoup galéré car je ne comprenais pas tout. Depuis, avec l'adapter du site, pour 95%, c'est du copié-collé, et ca va bien plus vite.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. enlever les slashes devant les apostrophes dans les mails
    Par laurentSc dans le forum Langage
    Réponses: 10
    Dernier message: 16/11/2010, 18h57
  2. Réponses: 3
    Dernier message: 06/08/2009, 17h09
  3. les classes et les templates dans les plugins
    Par asoka13 dans le forum C++
    Réponses: 22
    Dernier message: 24/01/2008, 17h11
  4. Réponses: 4
    Dernier message: 11/09/2006, 16h55
  5. Les polices dans les tables et les requêts
    Par zooffy dans le forum Access
    Réponses: 3
    Dernier message: 21/06/2006, 11h06

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