¿Por qué los elementos de ListView no crecen para envolver su contenido?

Tengo un ListView algo complejo, con alturas variables del artículo de la lista. Bajo ciertas condiciones, necesito mostrar una vista adicional en un elemento de lista, que está oculto por defecto (View.GONE). Al habilitarlo (View.VISIBLE), el elemento de lista crece en altura (o al menos se supone que).

El problema: Aunque declaro el diseño raíz del elemento a wrap_content y cada componente en el elemento fill_parent, la vista que ocultar / mostrar que se supone que cambia la altura del elemento se corta simplemente en la parte inferior en lugar de su padre Disposición del artículo) que crece en altura para exhibirla completamente.

¿Hay algunas gotchas relacionadas con ListViews y las disposiciones de los artículos y la altura de los artículos que puede haber perdido?

Algunas observaciones más:

Para los propósitos de la prueba he reducido ahora la disposición del artículo de la lista para contener apenas el LinearLayout de la raíz y un ImageView. Cuando establecí la altura de LinearLayout a por ejemplo 200dip y el ImageView a fill_parent, habría esperado que el ImageView crezca hasta que alcance el límite 200dip establecido por su padre.

Sin embargo, en su lugar, la imagen sólo será tan alta como su recurso de mapa de bits (como si lo hubiera configurado en wrap_content) y todo el elemento de la lista será de la misma altura (es decir, si lo hubiera configurado en wrap_content).

Sin embargo, si establezco la altura de la imagen por ejemplo 200dip, el elemento de la lista crecerá en altura, y también lo hará el diseño del elemento.

En otras palabras, el layout_height de la disposición del elemento de lista es completamente ignorado, y por lo tanto es cualquier valor de altura en ImageView que no sea un valor de píxel codificado.

Me las arreglé para arreglar esto, pero no entiendo por qué .

Como mencioné, había establecido el layout_height del diseño del elemento de lista en wrap_content (ya que fill_parent tiene sentido aquí, considerando que un ListView es indefinidamente alto).

Sin embargo, había establecido el layout_height de todas las vistas dentro de ese diseño a fill_parent . El problema desapareció al establecerlos en wrap_content .

Esto plantea otras dos preguntas:

1) ¿Cuál es la semántica de una vista pidiendo fill_parent , cuando el padre wraps_content ? ¿Qué tamaño de solicitud tiene prioridad?

2) ¿Cómo haría alguna vez una vista para llenar un elemento de lista si fill_parent aparentemente no funciona?

Gracias por sus chicos de entrada.

Pruebe esto: http://www.java2s.com/Code/Android/UI/setListViewHeightBasedOnChildren.htm

 public class Utils { public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); } } 

¿Cómo estás inflando tus filas?

Si no lo está usando ahora, intente usar LayoutInflater#inflate(layoutId, parent, false) (donde parent es el AdapterView suministrado para getView() o newView() ):

 v = getLayoutInflater().inflate(R.layout.list_item, parent, false); 

Los problemas con el diseño podrían ser causados ​​por ScrollView para ser el contenedor

Me tropecé con una nota en http://developer.android.com/reference/android/widget/ExpandableListView.html

"… Nota: No se puede usar el valor wrap_content para el atributo androide: layout_height de un ExpandableListView en XML si el tamaño del padre tampoco se especifica estrictamente (por ejemplo, si el padre era ScrollView no se pudo especificar wrap_content ya que también puede Sin embargo, puede utilizar wrap_content si el padre ExpandableListView tiene un tamaño específico, como 100 píxeles. "

Quité el envoltorio de ScrollView y el diseño lineal empezó a funcionar correctamente. Ahora es sólo para entender cómo envolver el material a ScrollView. Dios ayúdame

Pero de todos modos esto es un comportamiento realmente extraño. Creo que fill_parent no es una redacción correcta. Cuando uso la herramienta heirarchyviewer veo siempre los valores WRAP_CONTENT y MATCH_PARENT para layout_width y leayout_height. Así que probablemente fill_parent es en realidad significa match_parent que me pone en disonancia cognitiva.

Utilizo el "AbsListView.LayoutParams" para configurar el ancho y la altura manualmente dentro de "Adapter.getView ()".

Si está utilizando una View personalizada como el elemento de la lista que está cambiando de tamaño, puede tomar de la respuesta de PeBek y hacer esto cuando construye la View

 addOnLayoutChangeListener( new OnLayoutChangeListener() { @Override public void onLayoutChange(View _, int __, int ___, int ____, int bottom, int _____, int ______, int _______, int old_bottom) { final ListView list_view = (ListView) getParent(); final ViewGroup.LayoutParams params = list_view.getLayoutParams(); params.height += bottom - old_bottom; list_view.setLayoutParams(params); list_view.requestLayout(); } }); 

Cuando la View vuelve a clasificar según el tamaño este método de la devolución de llamada me funcionará y actualiza la altura de ListView para incluir el cambio en la altura (parte inferior del delta). Los otros valores, si resultan útiles para usted, son view (referencia a la vista), left , top , right , bottom , old_left , old_top , old_right , old_bottom . Funciona para expandir y colapsar la vista.

API 11 es necesario para OnLayoutChangeListener , no sé si hay una manera compatible hacia atrás para hacerlo.

Tuve el mismo problema: me gustaría tener una lista dentro de mi actividad que llenar toda la pantalla, ya sea cuando el dispositivo está en vertical que en la orientación horizontal. Resuelvo el problema usando Al Linear Layout que tienen altura que tienen que fill_parent y estableciendo la altura del elemento en la lista a 0dp mientras que el layout_weight es setter a 1.

 android:layout_weight="1" android:layout_height="0dp" 
  • ListView: ¿Cómo permanecer resaltado / seleccionado después de pulsar el botón Atrás?
  • ¿Existen la posición getFirstVisiblePosition y getLastVisiblePosition de ListView?
  • ListView grande en Android
  • El método getview de adaptador de lista personalizada que se llama varias veces y en ningún orden coherente
  • Cómo hacer que un elemento de una vista de lista no se pueda hacer clic en Android
  • Cómo limitar la selección de casilla de verificación en listview?
  • ListView onclick va a una nueva actividad
  • Android listview primera posición visible
  • Firebase para cargar más elementos en desplazamiento (Android)
  • Aplicación de la burbuja de chat de Android en ListView
  • Android listview diferentes vistas para cada elemento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.