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

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

El problema: aunque declaro el diseño raíz del elemento a wrap_content, y cada componente del elemento a fill_parent, la vista que escondo / muestro que se supone que cambia la altura del elemento simplemente se corta en la parte inferior en lugar de su elemento principal (el diseño del elemento) creciendo en altura para mostrarlo completamente.

¿Hay algún problema relacionado con ListViews y los diseños de los ítems y la altura del artículo que pude haber pasado por alto?

Algunas observaciones más:

Para fines de prueba, ahora he reducido el diseño del elemento de la lista para que solo contenga la raíz LinearLayout y un ImageView. Cuando configuré la altura de LinearLayout en, por ejemplo, 200dip y el ImageView en fill_parent, esperaba que ImageView creciera hasta que alcanzara el límite de 200 copias establecido por su elemento principal.

Sin embargo, la imagen solo será tan alta como su recurso de bitmap (como si lo hubiera configurado en wrap_content) y todo el elemento de la lista tendrá la misma altura (es decir, como si también lo hubiera configurado para wrap_content).

Sin embargo, si ajusto la altura de la imagen a 200 ppp, entonces el elemento de la lista crecerá en altura, al igual que el diseño del elemento.

En otras palabras, el layout_height del diseño del elemento de lista se ignora por completo, al igual que cualquier valor de altura en ImageView que no sea un valor de píxel codificado.

Logré arreglar esto, pero no entiendo por qué .

Como mencioné, establecí 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, configuré el layout_height de todas las vistas dentro de ese diseño para fill_parent . El problema desapareció al configurarlos en wrap_content en wrap_content lugar.

Esto plantea otras dos preguntas:

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

2) ¿Cómo podría hacer una vista para llenar un elemento de la lista si fill_parent aparentemente no funciona?

Gracias por su entrada chicos.

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á utilizando en este momento, intente utilizar LayoutInflater#inflate(layoutId, parent, false) (donde parent es AdapterView suministrado a getView() o newView() ):

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

Los problemas con el diseño pueden ser causados ​​por ScrollView para ser el contenedor

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

“… Nota: No puede usar el valor wrap_content para el atributo android: layout_height de una ExpandableListView en XML si el tamaño de los padres tampoco está estrictamente especificado (por ejemplo, si el padre era ScrollView no podía especificar wrap_content, ya que también puede Sea cualquier longitud. Sin embargo, puede usar wrap_content si el elemento principal ExpandableListView tiene un tamaño específico, como 100 píxeles. ”

Quité el ajuste de ScrollView y el diseño lineal comenzó a funcionar correctamente. Ahora solo es para entender cómo envolver las cosas en ScrollView. Dios ayúdame

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

Utilizo el “AbsListView.LayoutParams” para configurar el ancho y alto manualmente dentro de “Adapter.getView ()”.

Si está utilizando una View personalizada en como el elemento de la lista que está cambiando de tamaño, puede tomar de la respuesta de PeBek y hacer esto cuando construya 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 se cambia el tamaño de la View este método de callback se ejecutará y actualiza la altura de ListView para incluir el cambio de altura (parte inferior 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 contraer la vista.

Se requiere API 11 para OnLayoutChangeListener , no sé si hay una forma compatible con versiones anteriores para hacerlo.

Tuve el mismo problema: me gustaría tener una lista dentro de mi actividad que llene toda la pantalla cuando el dispositivo está en posición vertical en vez de horizontal. Resuelvo el problema utilizando al Linear Layout que tiene height que debe fill_parent, y establezco el alto del elemento en la lista a 0dp mientras que layout_weight es setter a 1.

 android:layout_weight="1" android:layout_height="0dp" 

esto funciona para mí