为什么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
(参考视图), left
, top
, right
, bottom
, old_left
, old_top
, old_right
, old_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>