Cómo limitar la altura de un ListView dentro de un GridLayout?

Tengo un GridLayout contiene un ListView y un TextView . Cuando los elementos se agregan al ListView crecerá en tamaño y empujar el TextView debajo de él fuera de la pantalla. Pensé que poniendo layout_gravity="fill" en el ListView no crecería en absoluto, sino que ocuparía todo el espacio disponible.

¿Cómo configuro ListView para ocupar el espacio disponible en vez de crecer y empujar las vistas debajo de él fuera de la pantalla?

Estoy buscando una solución usando un GridLayout . Soy consciente que en mi caso un LinearLayout trabajaría también. Sin embargo esto es sólo un caso de prueba mínima para ilustrar mi problema.

No quiero establecer la altura programáticamente, si es posible.

 <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="1" app:useDefaultMargins="true" > <ListView app:layout_gravity="fill" /> <TextView android:text="TextView" /> </android.support.v7.widget.GridLayout> 

Esta respuesta extiende mis comentarios a la pregunta e intenta explicar why this cannot be done with XML via GridLayout's attributes .

La adición de GridLayout al framework permitió solucionar una serie de inconvenientes con respecto a los diseños anidados, uno de los cuales era "inability to control alignment along both horizontal and vertical axes simultaneously" como se describe en el artículo Widgets New Layout: Space y GridLayout de Philip Milne.

Este control de alineación se realiza mediante el parámetro layout_gravity cuya description indica que el parámetro "specifies how a component should be placed in its group of cells", ( NOT within a root layout ). Básicamente, es lo mismo que LinearLayout , que también se menciona en el artículo: "Alignment/gravity also works just like gravity in LinearLayout..." Y como sabemos, para LinearLayouts , una vez que una vista ha tomado toda la altura de la (como ListView en su caso), las vistas de abajo van detrás de la pantalla si el layout oriention se establece en "vertical" .

Si observamos la documentación GridLayout.LayoutParams no encontraremos ningún parámetro que permita que un componente dentro de un grupo de celdas se adhiera a una determinada posición del diseño padre y se mantenga en la posición independiente del tamaño de otros componentes dentro del mismo grupo; similar a los layout_align[...] de un RelativeLayout.

Mi mejor conjetura sobre la ausencia de este tipo de parámetros en GridLayout es un mejor control de alineación comparado con diseños anidados.

Estoy seguro de que conoce una o GridLayout's soluciones para su problema usando un enfoque distinto de GridLayout's atributos de GridLayout's . Sólo sugeriré uno para que la respuesta se vea cumplida:

 <GridLayout ... > <RelativeLayout ... > <TextView ... android:id="@+id/tv" android:layout_alignParentBottom="true" /> <ListView ... android:layout_above="@id/tv"> </ListView> </RelativeLayout> </GridLayout> 

Puede establecer mediante programación la altura del ListView de la siguiente manera:

 ListView listView = (ListView) findViewById(R.id.listview); LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) listView.getLayoutParams(); layoutParams.height = listHeight; listView.setLayoutParams(layoutParams); listView.setAdapter(listAdapter); 

Sin embargo, no puedo pensar en una manera de hacer esta escala bien para múltiples dispositivos.

Sólo la forma en que puede limitar el tamaño de ListView con el contenido de ajuste como altura, es ampliar la clase, sobreescribir el método onMeasure y establecer su límite de altura allí. No soy consciente de cualquier parche de xml que le daría el efecto deseado.

Si lo desea, puede configurar su TextView dentro de un pie de página y, a continuación, el ListView no lo empujará. Aunque no estoy seguro si eso es lo que quieres

 <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <!-- Footer aligned to bottom --> <RelativeLayout android:id="@+id/footer" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:background="@drawable/background" android:gravity="center" > <!-- TextView Here --> </RelativeLayout> <!-- Content below header and above footer --> <RelativeLayout android:id="@+id/content" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/footer" android:gravity="center" > <!-- ListView Here --> </RelativeLayout> </GridLayout> 

Debe utilizar otro diseño como padre para ListView y TextView y colocarlos como desee.

 <android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:columnCount="1" app:useDefaultMargins="true" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_above="@+id/text_view_id" /> <TextView android:id="@+id/text_view_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:text="TextView" /> </RelativeLayout> </android.support.v7.widget.GridLayout> 
  • GridView y GridLayout en android
  • ¿Por qué los botones multilínea en gridlayout tienen margen superior extraño?
  • Cómo alinear dos TextViews dentro de la celda LinearLayout?
  • Cómo solucionar errores al implementar compatibilidad hacia atrás API 12 a 7 de Android GridLayout
  • Establecer layout_column y layout_row en GridLayout mediante programación
  • La alineación no es correcta al agregar vista dinámicamente a GridLayout
  • La adición dinámica de fragmentos con diseño xml a GridLayout no es workng
  • Tratando de replicar la alineación de la columna GridLayout con ConstraintLayout
  • GridView con diferentes tamaños de celdas, estilo pinterest
  • El uso de GridLayout de la biblioteca de soporte lleva a 'NoSuchMethodError: android.support.v4.view.ViewCompat.getLayoutDirection'
  • Cómo convertir mi linearLayout en GridView / GridLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.