¿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?
- Android: mostrar tarjetas como el diseño como en Google Keep
- Android - Split Dibujable
- Vista de cuadrícula personalizada con rango de fila y extensión de columna
- Cómo configurar la altura de gridview programáticamente android
- No se puede crear el menú "Compartir" en el menú emergente de Android
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>
- Cambio de fondo de una sola fila de gridview en android
- Android - ¿cómo puedo saber cuando gridview ha llegado al fondo?
- Eliminar el espaciado predeterminado en la vista de reciclador
- Tire para actualizar en Android sin biblioteca popular
- Cómo rellenar una vista de cuadrícula en XML
- Cómo diseñar una 'cuadrícula' de imágenes en el centro de la pantalla
- Tiene el método GridView setSelectionFromTop (int position, int y)
- Android GridView pinch zoom
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.