Android: Cómo medir la altura total de ListView

Necesito medir la altura total del ListView, pero parece que constantemente obtengo valores incorrectos. Estoy usando este código:

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(); } 

El problema es que estoy recibiendo una altura mayor de la que debería recibir. Cada elemento de la lista se mide de manera diferente y todos los artículos tienen la misma altura, por lo que definitivamente no debería hacer eso. La altura de cada elemento es al menos el doble de su altura real.

Gracias de antemano.

edit1:

Tengo dos ListViews y ambos tienen elementos con 6-7 campos EditText. Muestro / oculto ListView si el usuario quiere escribir / borrar valores en EditText. Todo funciona bien, excepto cuando quiero mostrar la lista, se necesita mucho espacio porque el método calculado ListView necesita mucho espacio. Debido a eso, tengo un montón de espacio vacío debajo de ese ListView. Como tres veces más espacio vacío que necesitaba.

¡Finalmente lo hice! Este es el código de trabajo que mide la altura de ListView y establece ListView en tamaño completo:

 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(); } 

Pruebe algo como esto:

 listItem.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { int listItemHeight = listItem.getHeight(); } }); 

Si quieres la altura de la lista, entonces prueba esto:

 listView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { public void onGlobalLayout() { int listViewHeight = listView.getHeight(); } }); 

También puede verificar esto: calcule el tamaño de una vista de lista o cómo decir que se expanda por completo

ListView almacena en caché los elementos de la vista y los vuelve a utilizar. Si tiene una vista de lista con 1000 elementos y solo 6 visibles, por qué no vale la pena mostrar el 994 que no se muestra.

Medir todo ListView significaría renderizar cada ListItem, parece un poco exagerado.

No sé lo que intentas lograr, pero probablemente haya una mejor manera 🙂