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 :

Problème avec les adapters


Sujet :

Android

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Problème avec les adapters
    Bonjour,

    J'ai un problème récurrent avec les adapters : dans la méthode getView, la position n'est pas la position réelle mais celle de l'item affiché. En gros, quel que soit la taille de la liste, la position 0 désigne le premier item affiché (je crois).

    Dans mon arrayAdapter de String, je charge d'abord les éléments avec la méthode add(). Ensuite je surcharge getView mais évidemment quand j'essaye d’accéder à une ressource de ma arrayList je fais un tablo.get(position).maMethode() et je me retrouve avec un retour aléatoire en fonction de l'affichage..

    J'ai le même problème avec une autoCompleteTextView, les éléments sont dans l'ordre mais la mauvaise position fait que je peux pas accéder aux bonnes méthodes de la List.

    Y a t-il un moyen de récupérer la position réel ? Comment faites vous dans ce genre de situation ?

    J'ai regardé les tutos de mickael-it mais je n'y vois rien qui puisse m'aider. Dans son exemple avec filles/garçons, la position n'est pas importante.

    J'espère avoir été assez clair,

    Merci d'avance.

  2. #2
    Membre extrêmement actif
    Avatar de Ryu2000
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    9 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9 606
    Points : 18 526
    Points
    18 526
    Par défaut
    Bonjour,
    Je ne comprend pas ce que tu appelles position réel.

    Si t'envoies une liste à ton adapter et que pour chaque objet tu retourne un layout, ça fait que dans l'ArrayList l'objet 0 va être l'item 0, l'objet 1 va être l'item 1 et donc tout va bien.

    Je ne comprend pas comment tu peut te retrouver avec de l'aléatoire.

    Et dans le tuto sur les ListView la position est importante puisqu'on voit à un moment : "Vous avez cliquez sur Nom 7", c'est que l'utilisateur à cliqué sur l'item 6.

    Par contre, je ne sais pas si c'est en rapport mais tu peux peut être essayer de setTag(), mais je ne suis pas sûre du tout, à mon avis c'est hors sujet.

    Tu devrais donner des exemples plus précis.
    Par exemple montre la liste d'objet que tu envois réellement à l'adapter.
    La méthode getView(), la liste affiché au final.
    Keith Flint 1969 - 2019

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Voici un bout de code :

    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
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.monLayout, R.id.monTextView) {
     
    			@Override
    			public View getView(int position, View convertView, ViewGroup parent) {
     
    				View v = convertView;
     
    				if (v == null) {
    					LayoutInflater inflater = monActivity.this.getLayoutInflater();
    					v = inflater.inflate(R.layout.monLayout, null);
    				}
     
    				TextView tv = (TextView)v.findViewById(R.id.monTextView);
    				tv.setText(maList.get(position).getNom());
     
    				ImageView iv = (ImageView)v.findViewById(R.id.monImageView);
     
    				if (b1 != null && position == 0)
    				iv.setImageBitmap(b1);
     
    				return v;
    			}
     
    		};
    Les textview se mettent bien mais les images se mettent de façon aléatoire en fonction d'où se trouve l'item. Ma liste est assez longue pour être scrollable. Quand je scroll, le premier item disparaît et l'item qui remonte en bas s'approprie l'image. J'avais lu quelque part qu'il ne fallait pas se fier à la position..

    T'arrives à voir où est le problème ?

    Merci d'essayer de m'aider en tout cas

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 51
    Points : 106
    Points
    106
    Par défaut
    Je croix que je peux proposer un réponse: Est-ce que c'est possible que le view, étant réutilisé, garde l'image que tu a injecté la première fois? Si c'est bien le cas, il ne faut que faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (b1 != null && position == 0) {
    	iv.setImageBitmap(b1);
    } else {
    	iv.setImageBitmap(null);
    }
    J'espère que tu le trouve utile.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci Pffft !

    On dirait que la vue est bien réutilisée. Du coup, si la position n'est pas 0 je retire l'image avec ta méthode. Je sais pas si c'est la meilleur façon de faire mais ça marche

    Je devrai mieux étudier le fonctionnement des adapters car j'ai encore des lacunes.

    Le problème de l'autoCompleteTextView est autre. En effet, à chaque nouvel affichage de la liste, les positions sont recalculées en fonction de la nouvelle liste affichée et ne gardent pas leurs valeurs initiales. Si vous avez une piste je suis preneur !

    Encore merci à vous deux

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 203
    Points
    203
    Par défaut
    Effectivement les vues sont réutilisés pour éviter de prendre trop de ressources.

    J'ai pas retrouvé le schéma (peut-être que quelqu'un donnera un lien), mais en gros lorsque ta ListView est affichée tu ne vois que quelques items (j'ai plus le nombre en tête).

    En gros, disons qu'il y a 12 items et on ne peut en voir que 10 à l'écran.
    L'item en position n = 0, quand on scroll vers le bas devient n = -1 et du coup l'ancien item en position n = -1 va être recyclé pour devenir n = 10 (invisible pour le moment), mais en continuant de scroller on le verra.

    Je sais pas si j'ai été tellement clair, je vais essayer de retrouver le schéma.

    Edit : Un blog avec le schéma et des explications http://android.amberfog.com/?p=296

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup Aerinder !

    Je comprends mieux maintenant grâce à ce schéma. On y voit bien le fonctionnement de la listview, c'est très utile.

    Sinon, des idées pour l'autocompletetv ?

  8. #8
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 203
    Points
    203
    Par défaut
    Pour l'AutoCompleteTextView je comprends pas trop le problème ? C'est l'affichage ou la récupération de la valeur sélectionné qui pose problème ?

    Pour la valeur, tu peux essayer ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    setOnItemClickListener(new OnItemClickListener() {
                public void onItemClick(AdapterView<?> adapter, View arg1, int position, long id) {
                   adapter.getItemAtPosition(position);
                   // ou
                   adapter.getSelectedItem();
                }
            });

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    En faite je cherche à injecter l'id d'une personne dans la vue affichée.

    Par exemple, si j'ai un tableau de personnes, dans le getView de l'adapter j'aimerai faire personnes[position].getId();

    et dans le textView faire un setTag avec l'id retourné.

    ça marche mais le problème est que: sur 20000 personnes, je tape "lio" je vais avoir une liste de personnes ayant un nom commençant par lio mais avec une position qui n'est pas relative aux 20 000 personnes mais une qui est fonction du nombre de résultats retournés. Du coup, l'id retourné sera celui d'une autre personne.

    Tu vois le truc ?

    Par exemple, si "lio" affiche 10 personnes, alors les positions iront de 0 à 9.

Discussions similaires

  1. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  2. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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