méthode personnalisée de listview adapter getView appelée plusieurs fois et sans ordre cohérent

J’ai un adaptateur de liste personnalisé:

class ResultsListAdapter extends ArrayAdapter { 

dans la méthode surchargée ‘getView’ je fais une impression pour vérifier quelle est la position et si c’est un convertView ou non:

  @Override public View getView(int position, View convertView, ViewGroup parent) { System.out.println("getView " + position + " " + convertView); 

La sortie de ceci (lorsque la liste est affichée pour la première fois, pas encore saisie par l’utilisateur)

 04-11 16:24:05.860: INFO/System.out(681): getView 0 null 04-11 16:24:29.020: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43d415d8 04-11 16:25:48.070: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43d415d8 04-11 16:25:49.110: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43d415d8 04-11 16:25:49.710: INFO/System.out(681): getView 0 android.widget.RelativeLayout@43d415d8 04-11 16:25:50.251: INFO/System.out(681): getView 1 null 04-11 16:26:01.300: INFO/System.out(681): getView 2 null 04-11 16:26:02.020: INFO/System.out(681): getView 3 null 04-11 16:28:28.091: INFO/System.out(681): getView 0 null 04-11 16:37:46.180: INFO/System.out(681): getView 1 android.widget.RelativeLayout@43cff8f0 04-11 16:37:47.091: INFO/System.out(681): getView 2 android.widget.RelativeLayout@43cff8f0 04-11 16:37:47.730: INFO/System.out(681): getView 3 android.widget.RelativeLayout@43cff8f0 

AFAIK, bien que je ne puisse pas le trouver explicitement déclaré, getView () est seulement appelé pour les lignes visibles. Comme mon application commence par quatre lignes visibles, au moins les numéros de position 0 à 3 ont du sens. Mais le rest est un désordre:

  • Pourquoi getview est-il appelé pour chaque ligne trois fois?
  • D’où viennent ces convertViews quand je n’ai pas encore fait défiler?

J’ai fait un peu de recherche, et sans obtenir une bonne réponse, j’ai remarqué que les gens associaient ce problème aux problèmes de mise en page. Donc, au cas où, voici la mise en page qui contient la liste:

      

et la disposition de chaque ligne individuelle:

       

Merci pour votre temps

Ce n’est pas un problème, il n’y a absolument aucune garantie sur l’ordre dans lequel getView() sera appelé ni combien de fois. Dans votre cas particulier, vous faites la pire chose possible avec un ListView en lui atsortingbuant une valeur height=wrap_content . Cela oblige ListView à mesurer quelques enfants de l’adaptateur au moment de la mise en page, pour savoir quelle taille il devrait être. C’est ce qui fournit ListView avec les convertViews vous voyez transmis à getView() avant même que vous ne getView() .

Essayez avec match_parent sur la propriété layout_height de la vue liste. Cela empêchera getView() d’être appelé si souvent.

Je me suis débarrassé de ce problème lorsque j’ai modifié layout_width et layout_height à match_parent (le fait de ne modifier que layout_height n’a pas aidé).


Remarque utile si vous avez des éléments nesteds. Vous devez changer le “plus haut” en match_parent . J’espère que ça aide quelqu’un.

Je ne suis pas en mesure de répondre à votre question “Pourquoi” mais j’ai définitivement une solution au problème de l’irritant ” Répétition des éléments ListView ” (si vous avez des éléments dans votre collection qui sont plus que la hauteur de l’écran).

Comme beaucoup de personnes l’ont déjà mentionné, conservez la propriété android: layout_height de la balise ListVew en tant que fill_parent .

Et à propos de la fonction getView (), la solution consiste à utiliser une classe statique appelée ViewHolder . Découvrez cet exemple. Il réussit à append tous les éléments dans ur Array ou ArrayCollection.

J’espère que cela aide les amis !!

Cordialement, Siddhant

Ques: Pourquoi Adapter appelle getView () à plusieurs resockets? Réponse: Comme Listview affiche lors du défilement, sa vue est actualisée avec les prochaines vues à venir, pour lesquelles l’adaptateur doit obtenir des vues en appelant getView ().

Ques: Pourquoi les appels sont-ils moins nombreux si la largeur et la hauteur de listview sont définies sur fill_parent? Réponse: Comme le gonfleur a la taille fixe pour la zone d’écran de la liste, il calcule une fois pour rendre les vues sur l’écran.

J’espère que cela va résoudre votre requête.

J’avais le même problème avec le menu déroulant dans AutoCompleteTextView. Je me suis battu avec le problème pendant deux jours jusqu’à mon arrivée ici et vous me montrez la solution.

Si j’écris dropDownHeight = “match_parent”, le problème est résolu. Maintenant, le problème est lié à l’interface utilisateur (lorsque vous avez un élément, le menu déroulant est trop volumineux) mais le problème des appels multiples (beaucoup plus important) est résolu.

Je vous remercie!!

“Pourquoi getview est-il appelé pour chaque ligne trois fois?” Parce que getView est appelée lorsque vous faites défiler une vue de liste et que vous dites mieux, elle est appelée lorsque la position d’une vue de votre liste est modifiée!

J’ai le même problème. Si j’ai la hauteur définie avec fill_parent, j’obtiens “généralement” 2 appels par ligne. Mais, si je mets la hauteur de mon ListView à la valeur exacte, disons 300dp, alors je reçois exactement un appel GetView par ligne.

Donc, il me semble que le seul moyen est de déterminer d’abord la hauteur de l’écran, puis de définir la hauteur de liste à cette valeur. Je n’aime pas ça J’espère qu’il y a une meilleure façon.

Pour tous ceux qui (après avoir défini la height de ListView pour match_parent ) sont toujours bloqués (comme je l’étais):

Vous devez également définir la height de la mise en page parent sur match_parent .

Voir exemple ci-dessous. LinearLayout est le parent ici:

     

Cela peut arriver tardivement mais si vous utilisez layout_weight rappelez-vous de toujours définir layout_width="0dp"