web-dev-qa-db-fra.com

Android: comment mesurer la hauteur totale de ListView

J'ai besoin de mesurer la hauteur totale du ListView mais il semble que je reçois constamment des valeurs erronées. J'utilise ce code:

public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        return;
    }

    int totalHeight = 0;
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(),
            MeasureSpec.AT_MOST);
    Log.w("DESIRED WIDTH", String.valueOf(listAdapter.getCount()));
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += listItem.getMeasuredHeight();
        Log.w("HEIGHT"+i, String.valueOf(totalHeight));
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight
            + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}

Le problème est que je reçois une hauteur plus grande que je ne devrais en recevoir. Chaque élément de la liste est mesuré différemment et tous les éléments ont la même hauteur, il ne devrait donc certainement pas faire cela. La hauteur de chaque élément est au moins le double de sa hauteur réelle.

Merci d'avance.

edit1:

J'ai deux ListViews et ils ont tous deux des éléments avec 6-7 champs EditText. J'affiche/masque ListView si l'utilisateur souhaite écrire/supprimer des valeurs dans EditText. Tout fonctionne bien sauf lorsque je veux afficher la liste, cela prend beaucoup d'espace car la méthode ListView calculée nécessite beaucoup d'espace. Pour cette raison, j'ai beaucoup d'espace vide en dessous de ce ListView. Comme trois fois plus d'espace vide qu'il fallait.

22
Cristiano

Enfin je l'ai fait! Il s'agit du code de travail qui mesure la hauteur de ListView et définit ListView en taille réelle:

public static void getTotalHeightofListView(ListView listView) {

    ListAdapter mAdapter = listView.getAdapter();

    int totalHeight = 0;

    for (int i = 0; i < mAdapter.getCount(); i++) {
        View mView = mAdapter.getView(i, null, listView);

        mView.measure(
                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),

                MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

        totalHeight += mView.getMeasuredHeight();
        Log.w("HEIGHT" + i, String.valueOf(totalHeight));

    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight
            + (listView.getDividerHeight() * (mAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();

}
52
Cristiano

Essayez quelque chose comme ceci:

listItem.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

  public void onGlobalLayout() {
    int listItemHeight = listItem.getHeight();
  }
});

Si vous voulez la hauteur de la listView, essayez ceci:

listView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

  public void onGlobalLayout() {
    int listViewHeight = listView.getHeight();
  }
});

Vous pouvez également vérifier ceci: Calculer la taille d'une vue de liste ou comment lui dire de se développer complètement

3
lokoko

ListView met en cache les éléments de la vue et les réutilise. Si vous avez une vue de liste avec 1000 éléments et seulement 6 visibles, pourquoi, cela ne vaut pas la peine de rendre le 994 non affiché.

Mesurer l'ensemble de ListView signifierait rendre chaque ListItem, semble un peu exagéré.

Je ne sais pas ce que vous essayez de réaliser mais il y a probablement une meilleure façon :)

0
Thibault D.