¿Cómo calculo la altura requerida de un GridView que está dentro de un ScrollView en Android?

Tengo un GridView dentro de un LinearLayout dentro de un ScrollView que las páginas en los datos del servidor. Debajo del GridView hay un botón para cargar más datos. Mi GridView tendrá una altura final mayor que la de la pantalla. Si establezco la altura de mi GridView en wrap_content o en parent_fill, se ajusta a la altura de pantalla disponible y no se desplaza, cortando las filas adicionales. Si establezco explícitamente el layout_height a algo grande, como 1000dip, el desplazamiento se comporta correctamente, sin embargo no puedo predecir la altura final de mi vista de desplazamiento apriori.

¿Cómo puedo determinar mediante programación la altura necesaria de un GridView para obtener el comportamiento deseado?

Aquí está mi diseño abajo. Como se puede ver, establezco la altura a 1000dip, pero eso es falso, necesito ese valor para establecerlo automáticamente / por programación:

<ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true" android:layout_weight="1" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/grid" android:layout_width="fill_parent" android:layout_height="1000dip" android:columnWidth="70dp" android:numColumns="auto_fit" android:verticalSpacing="0dp" android:horizontalSpacing="0dp" android:stretchMode="columnWidth" android:gravity="center" android:background="#000000" android:layout_weight="1" /> <Button android:id="@+id/load_more" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Load More Foo" /> </LinearLayout> </ScrollView> 

Aquí hay una manera de hacer esto, si alguien lo necesita. Un poco de un hack, pero hace el truco. Tienes que configurar GridView inicialmente lo suficientemente grande para todas las vistas (por ejemplo, 10000dip)

 final GridView imageContainer = // your GridView imageContainer.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { imageContainer.getViewTreeObserver().removeGlobalOnLayoutListener( this ); View lastChild = imageContainer.getChildAt( imageContainer.getChildCount() - 1 ); imageContainer.setLayoutParams( new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, lastChild.getBottom() ) ); } }); 

Sé que es un caso antiguo, pero tuve un problema similar donde mi ScrollView contenía múltiples LinearLayout s, que a su vez contenían un encabezado y un GridView . Básicamente hice secciones categorizadas con encabezados que contenían imágenes pertenecientes a esa categoría. El GridView tenía que tener una altura flexible.

He encontrado un montón de respuestas sobre sobreescribir onMeasure (), pero funcionó sólo en algunos dispositivos, no todos. La altura eventualmente sería 1, o 3 o sólo 0, mostrando sólo unos píxeles de la imagen.

Clase StretchingGridView

He pasado por alto el método drawableStateChanged() con este código, inspirado en la solución de @ Karitsa:

 @Override public void drawableStateChanged() { getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { getViewTreeObserver().removeOnGlobalLayoutListener( this ); View lastChild = getChildAt( getChildCount() - 1 ); if (lastChild != null) { int height = Math.max(lastChild.getBottom(), getColumnWidth()); float child = getAdapter().getCount(); float col = getNumColumns(); int rows = (int) Math.ceil(child / col); height = rows * getColumnWidth() + (getHorizontalSpacing() * rows-1); setLayoutParams( new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, height ) ); } } }); } 

Nota: Mi GridView utiliza imágenes cuadradas, por lo que baso la altura en su ancho. No creo que funcione bien con alturas de elementos de cuadrícula flexibles.

Al parecer GridViews dentro ScrollViews no son kosher en Android-tierra. Cambiar a ListView con filas personalizadas. Eso parece comportarse mejor.

  • Gridview multilínea Vista de texto cortada
  • Tire para actualizar para GridView en Android
  • Universal Image Loader gridview parpadea después de la llamada notifyDataSetChanged
  • GridView y el exceso de espacio de relleno
  • Cómo establecer un número fijo de filas en android gridView?
  • Cambiar dinámicamente el número de columna en android gridview?
  • Eliminar elemento de GridView
  • Android - RecyclerView espaciado entre elementos en una cuadrícula
  • ¿Cómo implementar Galería de imágenes en GridView en android?
  • Vista de cuadrícula obtener elementos que son visibles para el usuario
  • GridView OnItemClickListener no está llamando a onItemClick
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.