studio programacion para móviles español edición desarrollo desarrollar curso aprende aplicaciones android user-interface listview layout listviewitem

programacion - Android-Obtener la altura del elemento ListView?



manual programacion android español pdf (4)

¿Hay una manera de obtener la altura de ListViewItem en el código, cuando no hay elementos reales en la lista?

Mi diseño ListViewItem:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight"> ... </LinearLayout>

He intentado conseguirlo usando Inflater:

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

Pero es retorno 0;

¡Gracias!


Como Hariseldon78 arriba señala, ninguna de estas soluciones soluciona el problema REAL, que es determinar la altura de la fila del elemento de la lista ANTES de que se represente. Tuve el mismo problema, ya que quería escalar algunas imágenes a la altura de mis filas de elementos de ListView, y no quería escalarlas a un valor fijo. Si el tema causó que el texto en otras partes de la disposición de mi fila varíe en altura, quise la altura para que en mi rutina getView de mi adaptador pudiera cambiar el tamaño del bmap en consecuencia. Estaba luchando con el problema que getHeight y todas las alturas medidas informan de cero hasta que la fila se haya procesado. Para que yo viera las alturas correctas más tarde era demasiado tarde.

Mi solución es crear un onLayoutChangedListener () la primera vez a través de getView y solo para la fila 0. El oyente se activará tan pronto como getView para la primera posición (0) complete la ejecución, y en ese momento el parámetro "inferior" le indicará la altura de la fila. Grabo esto en una variable de clase de adaptador personalizado para que esté disponible como un parámetro de altura sin tener que buscar la altura nuevamente.

El oyente se desregistra como parte de su ejecución. Esto proporciona la altura adecuada para las filas 1-N pero no para la fila cero. Para la fila cero hice algo realmente desagradable. Hice que mi oyente llamara getView AGAIN para la fila 0 después de configurar otra variable de clase de adaptador personalizado para controlar la recursión. La segunda vez que se ejecuta getView (0) no configurará el oyente, y encontrará un parámetro válido para la altura con la que operar y todo está bien.

El código está abajo, no es necesario que me diga cuán IMPRESIONANTE es esto, si Android no tuvo que hacerlo tan difícil como para decir qué tan grande es la vista que estoy creando, cuando termine de rellenar las vistas en función de los parámetros de renderizado para el superficie no tendría que hacer esta fealdad pero funciona. Lo siento si el formato del código es 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; }


En Android, a una vista se le asigna Ancho y Alto solo cuando se completa su representación. Por lo tanto, a menos que su lista se muestre al menos una vez no obtendrá listItemHeight. La solución a su problema podría ser que establezca una Altura mínima de Elemento de la lista para que tenga al menos algo con qué trabajar en lugar de la altura y el ancho de Codificación Dura.


Prueba esto, funcionará para ti.

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


Versión optimizada del código de Dwivedi Ji con altura de divisores y sin parámetros innecesarios:

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