getView appelé avec mauvaise position lors du défilement rapide

assez nouveau développeur Android ici.

J'ai rencontré un problème étrange que je ne suis pas sûr de savoir comment contourner. J'ai lu beaucoup de problèmes ici et qui sonnent comme ils sont le même problème que j'ai, mais que les solutions à leurs problèmes ne semblent pas applicables à ce qui se passe ici.

J'ai un custom listView mis en place en utilisant une classe séparée qui s'étend BaseAdapter et utilise un point de vue titulaire (j'ai mis cela en regardant les différents exemples de la coutume listviews). Il a un affichage de texte, un bouton, une barre de progression et un bouton image, et ces éléments sont cachés/modifié basé sur une AsyncTask utilisé pour télécharger un fichier.

Tout fonctionne bien quand je l'ai faites défiler la liste lentement. Quand j'ai faites défiler la liste rapidement en haut/en bas, c'est comme si le point de vue de certaines cellules dans la liste se ré-attribuée à d'autres cellules.

J'ai mis cette ligne dans le haut de mon "getView" de la méthode dans ma classe d'adaptateur:

    @Override
    public View getView(final int pos, View convertView, ViewGroup parent)
    {
        Log.i("ks3","getView called, position is " + pos);

J'ai 7 éléments dans ma liste, et 6 d'entre eux adapter à l'écran. Quand il obtient tout d'abord, je vois cela dans mon journal:

getView called, position is 0
getView called, position is 1
getView called, position is 2
getView called, position is 3
getView called, position is 4
getView called, position is 5

Quand je scroll vers le bas lentement jusqu'à l'élément suivant, c'est imprimé suivant:

getView called, position is 6

Quand j'ai défiler l'écran vers le haut, ce:

getView called, position is 0

Allant vers le bas et lentement produire ces résultats parfaitement.

Quand je commence à défiler en arrière rapidement, il affiche ce message d'un tas de fois, la plupart montrant 6 et 0 comme la position, mais de temps en temps je vais voir:

getView called, position is 1
getView called, position is 5

Les Positions 1 et 5 ne devrait pas être appelé, car ils sont toujours à l'écran. C'est comme si getView ai tout mélangé. Dans le même temps, comme je l'ai dit avant, ma liste a l'air étrange. Boutons Image sera déplacé vers le haut ou vers le bas une cellule où ils ne devraient pas l'être.

Si je retourne à défilement en douceur, je ne vois que des 0 et 6 pour la position de nouveau.

Honnêtement, je ne suis pas sûr de la façon de contourner ce problème. J'ai pensé que je pourrais peut-être limiter à quelle vitesse vous êtes en mesure de faire défiler la liste, mais n'ont pas été en mesure de trouver quelque chose qui fonctionne.

Merci!

Edit:
Je voulais mettre à jour un couple de choses à propos de cette question. La première étant que, à partir d'un commentaire ici et à partir de la vidéo de Google sur la liste, il est venu à mon attention que getView peut être appelé à d'autres choses, alors ce que j'ai imaginé qu'il était, telles que les mesures, et donc je ne devrais pas être alarmé par ce que j'ai pensé à l'origine, était une partie de mon problème (qui est que je pensais que getView a été appelé avec les mauvaises positions).

Deuxièmement, j'ai vu plusieurs fois que c'est une très mauvaise idée de "cache des vues à l'intérieur de votre carte." Je ne suis pas tout à fait clair sur ce que cela signifie, mais je suis sûr que c'est une des choses que je fais mal (j'ai enregistrer une instance d'un bouton, progressBar, imageButton...).

Qui, avec le fait que j'ai mise à jour de la vue sur l'extérieur de getView et je n'utilise pas notifyDataSetChanged(); ceux qui, ensemble, sont probablement à l'origine de certains déglingués des trucs à se produire.

À moins que votre personnalisé ListView est en train de faire quelque chose de funky, cela ressemble à un recyclage de problème, postez votre plein getView() code.
Si vous ne trouvez pas toutes les erreurs dans votre code et et vous utiliser en Nid d'abeille ou au-dessus, vous pouvez essayer de désactiver l'accélération matérielle pour votre mise en forme de liste. L'accélération matérielle peut potentiellement causer de telles erreurs.
Il ne se sent comme un recyclage question. Je vais jeter un oeil à la vidéo de Google sur les listViews et de voir s'il y a des flagrants problèmes avec la façon dont je suis l'aide de la liste.

OriginalL'auteur Droidmon | 2012-03-15