From:http://www.jayway.com/2012/10/04/how-to-make-the-height-of-a-gridview-wrap-its-content/
如果把GridView放到一个垂直方向滚动的布局中,设置其高度属性为 wrap_content ,则该GridView的高度只有一行内容,其他内容通过滚动来显示。 如果你想让该GridView的高度为所有行内容所占用的实际高度,则可以通过覆写GridView的 onMeasure 函数来修改布局参数:
package com.jayway.components; import android.content.Context; import android.util.AttributeSet; import android.widget.GridView; public class MyGridView extends GridView { public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int heightSpec; if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) { // The great Android "hackatlon", the love, the magic. // The two leftmost bits in the height measure spec have // a special meaning, hence we can‘t use them to describe height. heightSpec = MeasureSpec.makeMeasureSpec( Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); } else { // Any other height should be respected as is. heightSpec = heightMeasureSpec; } super.onMeasure(widthMeasureSpec, heightSpec); } }
activity_main.xml <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- Header One --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:text="Header 1" /> <!-- Custom grid view holding the ‘Group 1‘ items --> <com.jayway.components.MyGridView android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="3" android:stretchMode="columnWidth" android:id="@+id/grid_view_1" /> <!-- Header 2 --> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Header 2" /> <!-- Custom grid view holding the ‘Group 2‘ items --> <com.jayway.components.MyGridView android:layout_width="match_parent" android:layout_height="wrap_content" android:numColumns="3" android:stretchMode="columnWidth" android:id="@+id/grid_view_2" /> </LinearLayout> </ScrollView>
MainActivity.java package com.jayway.app; import java.util.ArrayList; import android.os.Bundle; import android.widget.ArrayAdapter; import android.app.Activity; import com.jayway.components.MyGridView; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ArrayList labels = new ArrayList(); for (int i = 0; i < 24; i++) { labels.add("Item " + i); } ArrayAdapter adapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, labels); MyGridView grid1 = (MyGridView) findViewById(R.id.grid_view_1); grid1.setAdapter(adapter); MyGridView grid2 = (MyGridView) findViewById(R.id.grid_view_2); grid2.setAdapter(adapter); } }
使用原生GridView实现的最终效果如下图:
使用修改过的GridView效果如下图: