Pourquoi les éléments ListView ne se développent-ils pas pour envelopper leur contenu?

J’ai un ListView plutôt complexe, avec des hauteurs d’élément de liste de variables. Dans certaines conditions, je dois afficher une vue supplémentaire dans un élément de liste, qui est masqué par défaut (View.GONE). En l’activant (View.VISIBLE), l’élément de la liste grandit en hauteur (ou du moins c’est supposé).

Le problème: même si je déclare la disposition racine de l’élément à wrap_content et que chaque composant de l’élément à fill_parent, la vue que je cache / montre et qui est censée changer la hauteur de l’élément est simplement coupée au lieu de son parent (le disposition de l’article) en hauteur pour l’afficher complètement.

Y a-t-il des pièges liés aux vues ListViews et à la disposition des objects et à la hauteur de l’article que j’ai pu manquer?

Quelques observations supplémentaires:

À des fins de test, j’ai maintenant réduit la disposition des éléments de liste pour ne contenir que la racine LinearLayout et une ImageView. Lorsque je mets la hauteur LinearLayout à 200dip et que ImageView à fill_parent, je m’attendrais à ce qu’ImageView se développe jusqu’à ce qu’il atteigne la limite de 200dip définie par son parent.

Cependant, l’image ne sera jamais aussi grande que sa ressource bitmap (comme si j’avais défini wrap_content) et la totalité de l’élément de la liste sera de la même hauteur (c’est-à-dire si je l’avais également définie sur wrap_content).

Si, toutefois, je règle la hauteur de l’image sur 200dip, l’élément de la liste augmentera en hauteur, tout comme la disposition de l’élément.

En d’autres termes, le layout_height de la disposition d’élément de liste est complètement ignoré, de même que toute valeur de hauteur sur ImageView autre qu’une valeur de pixel codée en dur.

J’ai réussi à résoudre ce problème, mais je ne comprends pas pourquoi .

Comme je l’ai mentionné, j’ai défini le layout_height de la disposition des éléments de la liste sur wrap_content (puisque fill_parent n’a pas de sens ici, étant donné qu’un ListView est indéfiniment grand).

Cependant, j’ai défini le layout_height de toutes les vues de cette mise en page sur fill_parent . Le problème a disparu lors de la configuration de wrap_content place.

Cela soulève deux autres questions:

1) Quelle est la sémantique d’une vue demandant à fill_parent , lorsque le parent wraps_content ? Quelle demande de taille a priorité?

2) Comment pourrais-je créer une vue pour remplir un élément de la liste si fill_parent ne fonctionne apparemment pas?

Merci pour votre consortingbution les gars.

Essayez ceci: 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(); } } 

Comment gonflez-vous vos lignes?

Si vous ne l’utilisez pas maintenant, essayez d’utiliser LayoutInflater#inflate(layoutId, parent, false) (où parent est AdapterView fourni à getView() ou newView() ):

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

Les problèmes avec la mise en page peuvent être causés par ScrollView pour être le wrapper

Je suis tombé sur une note dans http://developer.android.com/reference/android/widget/ExpandableListView.html

“… Remarque: vous ne pouvez pas utiliser la valeur wrap_content pour l’atsortingbut android: layout_height d’un ExpandableListView en XML si la taille du parent n’est pas ssortingctement spécifiée (par exemple, si le parent était ScrollView, vous ne pouvez pas spécifier wrap_content car il peut également Vous pouvez utiliser wrap_content si le parent ExpandableListView a une taille spécifique, par exemple 100 pixels. ”

J’ai enlevé l’emballage ScrollView et la disposition linéaire a commencé à fonctionner correctement. Maintenant, il ne lui rest plus qu’à comprendre comment envelopper les choses dans ScrollView. Dieu aide moi

Mais de toute façon, c’est un comportement vraiment étrange. Je pense que fill_parent n’est pas vraiment correct. Lors de l’utilisation de l’outil heirarchyviewer, je vois toujours les valeurs WRAP_CONTENT et MATCH_PARENT pour layout_width et leayout_height. Donc, probablement fill_parent signifie en réalité match_parent, ce qui me place dans la dissonance cognitive.

J’utilise les “AbsListView.LayoutParams” pour configurer manuellement la largeur et la hauteur dans “Adapter.getView ()”.

Si vous utilisez un affichage personnalisé en tant qu’élément de la liste qui est redimensionné, vous pouvez prendre la réponse de PeBek et le faire lorsque vous construisez 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(); } }); 

Lorsque la View est redimensionnée, cette méthode de rappel s’exécute et met à jour la hauteur ListView pour inclure le changement de hauteur (delta bottom). Les autres valeurs, si elles vous sont utiles, sont view (référence à la vue), left , top , right , bottom , old_left , old_top , old_right , old_bottom . Cela fonctionne pour agrandir et réduire la vue.

L’API 11 est requirejse pour OnLayoutChangeListener , ne sait pas s’il existe une méthode de compatibilité ascendante.

J’ai eu le même problème: je voudrais avoir une liste dans mon activité qui remplisse tout l’écran soit lorsque l’appareil est vertical que horizontal. Je résous le problème en utilisant la disposition linéaire avec hauteur qui doit remplir_parent, et en définissant la hauteur de l’élément dans la liste à 0dp alors que le paramètre layout_weight est défini sur 1.

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

cela fonctionne pour moi