Android – Obtenez la hauteur de l'article ListView?

Existe-t-il un moyen d'obtenir la hauteur de ListViewItem dans le code, lorsqu'il n'y a pas d'éléments réels dans la liste?

Ma disposition ListViewItem:

  • Parcourir l'arrière-plan de l'élément via un sélecteur personnalisé
  • Articles de liste Animation Arrêt pendant le défilement
  • Méthode d'activité d'appel de l'adaptateur
  • Bordure des éléments de listview dans Android
  • Comment créer une barre de défilement alphabétique affichant toute la lettre dans Android?
  • Affichage de la liste à l'élément
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight"> ... </LinearLayout> 

    J'ai essayé de l'utiliser en utilisant Inflater:

     View convertView = LayoutInflater.from( this ) .inflate( R.layout.mail_list_row, null ); int itemHeight = convertView.getHeight(); 

    Mais c'est un retour 0;

    Merci!

    4 Solutions collect form web for “Android – Obtenez la hauteur de l'article ListView?”

    Dans Android, une vue est affectée de Largeur et Hauteur uniquement lorsque son rendu est terminé. Donc, à moins que votre liste ne soit rendue au moins une fois, vous n'obtiendrez pas listItemHeight. La solution à votre problème pourrait être que vous avez réglé une quantité minime de l'article de la liste pour que vous ayez au moins quelque chose à travailler au lieu de la hauteur et de la largeur du codage dur.

    Essayez cela, cela fonctionnera pour vous.

     private static final int UNBOUNDED = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); // To calculate the total height of all items in ListView call with items = adapter.getCount() public static int getItemHeightofListView(ListView listView, int items) { ListAdapter adapter = listView.getAdapter(); int grossElementHeight = 0; for (int i = 0; i < items; i++) { View childView = adapter.getView(i, null, listView); childView.measure(UNBOUNDED, UNBOUNDED); grossElementHeight += childView.getMeasuredHeight(); } return grossElementHeight; } 

    Version optimisée du code de Dwivedi Ji avec hauteur de cloisons et sans params inutiles:

     private int calculateHeight(ListView list) { int height = 0; for (int i = 0; i < list.getCount(); i++) { View childView = list.getAdapter().getView(i, null, list); childView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); height+= childView.getMeasuredHeight(); } //dividers height height += list.getDividerHeight() * list.getCount(); return height; } 

    Comme l'indique Hariseldon78 ci-dessus, aucune de ces solutions ne corrige le problème REAL qui détermine la hauteur de la rangée d'élément de liste avant qu'il ne soit rendu. J'ai eu le même problème que je voulais mettre à l'échelle certaines images à la hauteur de mes rangées d'éléments ListView, et je ne voulais pas les mettre à une valeur fixe. Si le thème a amené le texte dans d'autres parties de ma disposition de la rangée à varier en hauteur, je voulais la hauteur afin que, dans ma routine getView de mon adaptateur, je puisse redimensionner le bmap en conséquence. Je luttais contre le problème que getHeight et toutes les hauteurs mesurées rapportent zéro jusqu'à ce que la ligne ait été rendue. Pour moi, voir les hauteurs correctes était trop tard.

    Ma solution est de créer un OnLayoutChangedListener () la première fois via getView et uniquement pour la ligne 0. L'auditeur déclenchera dès que getView effectuera la première position (0) et, à ce moment, le paramètre "bottom" vous indiquera La hauteur de la rangée. Je l'enregistre dans une variable de classe d'adaptateur personnalisée, de sorte qu'il est disponible en tant que paramètre de hauteur sans avoir à récupérer la hauteur à nouveau.

    L'auditeur se désiste comme une partie de son exécution. Cela fournit la hauteur appropriée pour les lignes 1-N mais pas pour la ligne zéro. Pour la ligne zéro, j'ai fait quelque chose de vraiment méchant. J'ai appris mon interlocuteur getView NOUVEAU pour la ligne 0 après avoir configuré une autre variable de classe d'adaptateur personnalisée pour contrôler la récurrence. La deuxième fois que getView (0) exécute, il ne configurera pas l'auditeur et trouvera un paramètre valide pour que la hauteur fonctionne et tout est bon.

    Le code est ci-dessous – pas besoin de me dire combien il est horrible – si l'Android n'a pas dû rendre tellement difficile de dire à quel point la vue que je crée est quand j'ai fini de peupler la vue en fonction des rendez-vous de rendu Je ne devrais pas faire cette laideur mais ça marche. Désolé si le formatage du code est horrible …

     int mHeight = 0; @Override public View getView(final int position, View convertView, ViewGroup parent) { ... usual boiler plate stuff // JUST THE FIRST TIME if (position == 0 && mHeight == 0) { final View ref = convertView; convertView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { ref.removeOnLayoutChangeListener(this); mHeight = bottom; firstTime = false; // NOW LETS REGET THE FIRST VIEW WITH THE HEIGHT CORRECT int visiblePosition = getListView().getFirstVisiblePosition(); View view = getListView().getChildAt(0 - visiblePosition); getListAdapter().getView(0, view, getListView()); // RECURSION LOL } }); } // Configure the view for this row .... // HOW BIG IS THE VIEW? // NOW IF NOT FIRSTTIME (MHEIGHT != 0) if (mHeight != 0) { // DO OUR IMAGE SETUP HERE CAUSE mHeight is RIGHT! Log.d(TAG, "mHeight=" + mHeight); } return convertView; } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.