如何在添加项目时使GridView适应其高度

我试图显示一个dynamic增长的string列表,在GridView中有一个checkbox,它本身在一个TableLayout中。

我可以连续显示这些“checkbox”的string。 当我让用户在GridView中dynamic添加新string时,就会出现我的问题。

我创build了一个接收string列表的自定义适配器。 假设我们有n个string。 该适配器返回“n + 1”的项目计数; 在getView中,它返回:

  • 一个带有LinearLayout的视图,它本身有一个checkbox和一个EditText作为前n个项目,
  • 带有简单button的LinearLayout,第n + 1个项目带有“+”标题。

到现在为止还挺好。 当单击“+”button时,我将一个空string添加到string列表中,并在适配器中调用notifyDataSetChanged。

GridView重绘了一个更多的项目。 但它保持其原来的高度,并创build一个垂直滚动条。 我希望GridView扩展其高度(即占用屏幕上的更多空间并显示所有项目)。

我试图将屏幕更改为垂直LinearLayout而不是TableLayout,但结果是相同的。

这是我的屏幕的布局:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="none"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- other lines omitted --> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/wine_rack_explanation" android:layout_gravity="center_vertical" /> <GridView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/gvRack" android:columnWidth="90dp" android:numColumns="auto_fit" /> </LinearLayout> <!-- other lines omitted --> </LinearLayout> </ScrollView> 

适配器中的checkbox+string项定义如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <CheckBox android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/cbCoordinate" android:checked="true" /> <EditText android:id="@+id/txtCoordinate" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> 

“+”button项目定义如下:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:id="@+id/btnAddBottle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/add_bottle_caption" /> </LinearLayout> 

添加项目后,我试图在GridView上调用invalidate或invalideViews。 在TableLayout和TableRow上也被称为无效(在屏幕的前一个布局中)。 没有成功。

任何想法为什么GridView拒绝延长其高度?

(请注意,我完全打开使用GridView以外的其他视图组)

Solutions Collecting From Web of "如何在添加项目时使GridView适应其高度"

使用这个代码

 public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } 

我这样做了:

这段代码将根据Child的 编号设置GridView高度。

注意:其中5是列数。

 private void setDynamicHeight(GridView gridView) { ListAdapter gridViewAdapter = gridView.getAdapter(); if (gridViewAdapter == null) { // pre-condition return; } int totalHeight = 0; int items = gridViewAdapter.getCount(); int rows = 0; View listItem = gridViewAdapter.getView(0, null, gridView); listItem.measure(0, 0); totalHeight = listItem.getMeasuredHeight(); float x = 1; if( items > 5 ){ x = items/5; rows = (int) (x + 1); totalHeight *= rows; } ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = totalHeight; gridView.setLayoutParams(params); } 

希望这会帮助你。

这对我有用:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/root" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/background" > <!-- MORE LAYOUTS IF YOU WANT --> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:fillViewport="true" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <!-- MORE LAYOUTS IF YOU WANT --> <GridView android:id="@+id/gridview" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="5dp" android:gravity="center" android:horizontalSpacing="10dp" android:numColumns="auto_fit" android:stretchMode="columnWidth" android:verticalSpacing="10dp" > </GridView> <!-- MORE LAYOUTS IF YOU WANT --> </RelativeLayout> </ScrollView> </RelativeLayout> 

当为GridView调用onMeasure()时,如果heightMode是MeasureSpec.UNSPECIFIED,那么gridview将和它包含的所有元素(加上一些填充)一样高。

为了确保这种情况,可以使用一个快速的自定义视图来扩展GridView并包含以下覆盖:

  @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, MeasureSpec.UNSPECIFIED); } 

格雷厄姆的解决scheme并不适合我。 但是,这一点(多一点黑客): https : //stackoverflow.com/a/8483078/479478