为什么ListView项不能增长以包装其内容?

我有一个相当复杂的ListView,具有可变列表项高度。 在某些情况下,我需要在默认情况下隐藏(View.GONE)的列表项目中显示一个额外的视图。 通过启用它(View.VISIBLE),列表项目的高度增长(或至less应该)。

问题:即使我将项目的根布局声明为wrap_content,并将项目中的每个组件都填充为fill_parent,但是我隐藏/显示应该更改项目高度的视图只是在底部而不是其父项(项目布局)的高度增长,以充分显示它。

是否有任何有关ListViews和项目布局和项目高度,我可能已经错过了陷阱?

还有一些观察:

为了testing的目的,我现在已经减less了列表项的布局,只包含LinearLayout根和一个ImageView。 当我将LinearLayout高度设置为例如200dip并将ImageView设置为fill_parent时,我预计ImageView会增长,直到达到其父级设置的200dip限制。

然而,图像将只是它的位图资源一样高(如果我已经把它设置为wrap_content),整个列表项将是相同的高度(即,如果我也设置它wrap_content)。

但是,如果我将图像高度设置为例如200dip,则列表项目的高度将增加,项目布局也将增加。

换句话说,列表项布局的layout_height完全被忽略,ImageView上的高度值也是硬编码的像素值。

我设法解决这个问题,但我不明白为什么

正如我所提到的,我已经将列表项目布局的layout_height设置为wrap_content (因为fill_parent在这里是无意义的,因为ListView是无限高的)。

但是,我已经将该布局中的所有视图的layout_height设置为fill_parent 。 问题在设置为wrap_content时消失。

这引发了另外两个问题:

1)什么是视图要求fill_parent ,当父母wraps_content ? 哪个尺寸的请求优先?

2)如果fill_parent显然不起作用,我怎样才能使视图填充列表项?

感谢您的input人。

试试这个: 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(); } } 

你怎么膨胀你的行?

如果您现在不使用它,请尝试使用LayoutInflater#inflate(layoutId, parent, false) (其中parent是提供给getView()newView() ):

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

ScrollView可能会导致布局问题

我偶然发现了http://developer.android.com/reference/android/widget/ExpandableListView.html

“…注意:如果父级的大小也没有严格指定,则不能使用值为wrap_content的XML的ExpandableListView的android:layout_height属性(例如,如果父级是ScrollView,则无法指定wrap_content,因为它也可以可以是任何长度,但是,如果ExpandableListView父级具有特定的大小,例如100像素,则可以使用wrap_content。

我删除了包装ScrollView和线性布局开始正常工作。 现在只有了解如何将这些东西包装到ScrollView。 神救救我

但无论如何,这是非常奇怪的行为。 我认为fill_parent不是真的正确的措辞。 当使用heirarchyviewer工具时,我总是看到layout_width和leayout_height的WRAP_CONTENT和MATCH_PARENT值。 所以可能fill_parent实际上意味着match_parent这使我在认知上的不和谐。

我使用“AbsListView.LayoutParams”在“Adapter.getView()”中手动configuration宽度和高度。

如果您正在使用自定义View作为正在resize的列表项,那么您可以从PeBek的答案中获取,并在构buildView时执行此操作

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

View被resize时,这个callback方法将会运行,并且它会更新ListView高度以包含高度的变化(delta底部)。 其他值,如果他们certificate对你有用的是view (参考视图), lefttoprightbottomold_leftold_topold_rightold_bottom 。 它适用于扩展和折叠视图。

OnLayoutChangeListener需要API 11 ,不知道是否有向后兼容的方式。

我有同样的问题:我想在我的活动内有一个列表,填充所有的屏幕,当设备是垂直比水平方向。 我使用线性布局解决了这个问题,它的高度必须为fill_parent,并且在layout_weight设置为1时,将列表中的项目高度设置为0dp。

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

这对我有用

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="@dimen/activity_vertical_margin"> <TextView android:id="@+id/tv_status" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textSize="17sp" android:text="@string/text_list_devices" /> <ListView android:id="@+id/lv_paired" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/activity_vertical_margin" android:cacheColorHint="#00000000" android:layout_above="@+id/signup_t" android:layout_below="@id/tv_status" /> <Button android:id="@+id/signup_t" style="?android:textAppearanceSmall" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:textColor="@android:color/white" android:layout_alignParentBottom="true" android:text="Print All Records" android:typeface="sans" android:layout_marginLeft="45dp" android:layout_marginRight="45dp" android:textSize="24sp" android:background="@drawable/selector_for_button" android:textStyle="bold" /> </RelativeLayout>