169 votes

méthode getView de l’adaptateur listview personnalisé appelé plusieurs fois et sans ordre cohérent

J'ai une liste personnalisée de l'adaptateur:

class ResultsListAdapter extends ArrayAdapter<RecordItem> {

dans le substituée 'getView la méthode des" je ne une impression pour vérifier que la position est et si c'est un convertView ou pas:

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

La sortie de cette (lorsque la liste est affichée pour la première fois, aucune entrée d'utilisateur encore)

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  

Autant que je sache, bien que je ne pouvais pas trouver il a déclaré explicitement, getView() est appelée uniquement pour les lignes visibles. Depuis mon application démarre avec quatre lignes visibles au moins la position des numéros de vélo de 0-3 sens. Mais le reste est un gâchis:

  • Pourquoi est-getview appelée pour chaque ligne trois fois?
  • Où sont ces convertViews à venir à partir de quand je n'ai pas défilé encore?

J'ai fait un peu de recherche, et sans l'obtention d'une bonne réponse, j'ai remarqué que les gens étaient en associant cette question avec les problèmes d'implantation. Donc au cas où, voici la page qui contient la liste:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent" 
    android:orientation="vertical" >

    <TextView android:id="@+id/pageDetails"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" />

    <ListView android:id="@+id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:drawSelectorOnTop="false" />

</LinearLayout>

et la mise en page de chaque ligne:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="108dp"    
android:padding="4dp">

<ImageView
    android:id="@+id/thumb"        
    android:layout_width="120dp"
    android:layout_height="fill_parent"        
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginRight="8dp"        
    android:src="@drawable/loading" />

<TextView  
    android:id="@+id/price"
    android:layout_width="wrap_content"
    android:layout_height="18dp"         
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentBottom="true"       
    android:singleLine="true" />

<TextView  
    android:id="@+id/date"
    android:layout_width="wrap_content"
    android:layout_height="18dp"         
    android:layout_alignParentBottom="true"
    android:layout_alignParentRight="true" 
    android:paddingRight="4dp"       
    android:singleLine="true" />

<TextView
    android:id="@+id/title"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textSize="17dp" 
    android:layout_toRightOf="@id/thumb"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:paddingRight="4dp"   
    android:layout_alignWithParentIfMissing="true"
    android:gravity="center" />

</RelativeLayout>

Je vous remercie pour votre temps

277voto

Romain Guy Points 57114

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 sont en train de faire la pire chose possible avec un ListView lui height=wrap_content. Cela oblige ListView à mesurer quelques enfants de l'adaptateur à la disposition du temps pour savoir comment grand il devrait être. C'est ce que fournit ListView avec l' convertViews vous voir passé de getView() avant même de vous défiler.

56voto

Fred T Points 281

Essayez avec « fill_parent » sur la propriété layout_height de l’affichage de la liste. Il empêchera GetView () un être appelé si souvent.

45voto

Eugene Chumak Points 737

Je me suis débarrassé de ce problème lorsque j’ai changé les deux layout_width et layout_height à match_parent (changeant seulement layout_height n’a pas aidé).


Remarque utile Méfiez-vous si vous avez imbriqué des éléments. Tu dois changer les « colonels » à match_parent. Espérons que cela aide quelqu'un.

7voto

Siddhant Points 194

Je ne suis pas en mesure de répondre à votre "Pourquoi" la question, mais j'ai certainement une solution au problème de l'irritation "ListView éléments de répéter" problème(si vous avez des articles dans ur de la collection, qui sont plus que la hauteur de l'écran).

Comme de nombreuses personnes l'ont mentionné, garder le android:layout_height propriété de la ListVew tag fill_parent.

Et à propos de la fonction getView (), la solution est d'utiliser une classe statique appelé ViewHolder. Découvrez cet exemple. Il fait avec succès la tâche de l'ajout de tous les éléments dans le Tableau ou de type arraycollection.

Espérons que cela aide les amis!!

Meilleures Salutations, Siddhant

4voto

jitain sharma Points 180

Question : Pourquoi il appelle GetView () un manytimes ? Rép. : Comme Listview restitue le défilement est rafraîchit c’est vue donnant sur la prochaine à venir, pour quels besoins adaptateur obtenir les vues de GetView () un appel.

Question : Pourquoi c’est appels moindre si height et width de listview la valeur fill_parent ? Rép. : Parce que comme gonfleur a la taille fixe pour la zone d’écran pour voir il calcule une fois pour restituer les points de vue sur l’écran.

Espère qu’il va résoudre votre requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X