本人一个activity里放入2个GridView,每个GridView里都有很多数据。本人的目标是想只让ScrollView滚动,GridView的高度可以很高很高超过屏幕高度,但不滚动。但是按下面这样写完,发现原本应该显示很多行的GridView却只显示一行内容。本人的适配数据部分没错,原因是本人把两个GridView的高度假如写死成500dp,而不用wrap_content的话,就能正常显示全部内容,但当中原因是写死了高度,所以多出很多空白。问一下这个怎么解决呢?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="ecust.mlkz.act_MLKZ_HomePage"> <include android:id="@+id/part_actionbar" layout="@layout/part_actionbar" /> <ScrollView android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="跳蚤市场" /> <GridView android:id="@+id/gv1" android:layout_width="match_parent" android:layout_height="wrap_content" android:horizontalSpacing="0dp" android:numColumns="auto_fit" android:stretchMode="columnWidth" android:verticalSpacing="0dp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="励志书院" /> <GridView android:id="@+id/gv2" android:layout_width="match_parent" android:layout_height="wrap_content" android:horizontalSpacing="0dp" android:numColumns="auto_fit" android:stretchMode="columnWidth" android:verticalSpacing="0dp" /> </LinearLayout> </ScrollView> </LinearLayout>
ArrayList<HashMap<String, Object>> lstImageItem = new ArrayList<HashMap<String, Object>>(); for(int i=0;i<7;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", R.drawable.icon);//添加图像资源的ID map.put("ItemText", "aa"+String.valueOf(i));//按序号做ItemText lstImageItem.add(map); } //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应 SimpleAdapter saImageItems = new SimpleAdapter(this, //没什么解释 lstImageItem,//数据来源 R.layout.gv,//night_item的XML实现 //动态数组与ImageItem对应的子项 new String[] {"ItemImage","ItemText"}, //ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] {R.id.gv_iv,R.id.gv_tv}); GridView gv1=(GridView) findViewById(R.id.gv1); gv1.setAdapter(saImageItems); gv1.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { HashMap<String, Object> item = (HashMap<String, Object>) parent.getItemAtPosition(position); //显示所选Item的ItemText Toast.makeText(act_MLKZ_HomePage.this, "aa" + position, Toast.LENGTH_SHORT).show(); } }); ArrayList<HashMap<String, Object>> lstImageItem2 = new ArrayList<HashMap<String, Object>>(); for(int i=0;i<30;i++) { HashMap<String, Object> map = new HashMap<String, Object>(); map.put("ItemImage", R.drawable.icon);//添加图像资源的ID map.put("ItemText", "bb"+String.valueOf(i));//按序号做ItemText lstImageItem2.add(map); } //生成适配器的ImageItem <====> 动态数组的元素,两者一一对应 SimpleAdapter saImageItems2 = new SimpleAdapter(this, //没什么解释 lstImageItem2,//数据来源 R.layout.gv,//night_item的XML实现 //动态数组与ImageItem对应的子项 new String[] {"ItemImage","ItemText"}, //ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] {R.id.gv_iv,R.id.gv_tv}); GridView gv2=(GridView) findViewById(R.id.gv2); gv2.setAdapter(saImageItems2); gv2.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { HashMap<String, Object> item = (HashMap<String, Object>) parent.getItemAtPosition(position); //显示所选Item的ItemText Toast.makeText(act_MLKZ_HomePage.this, "bb" + position, Toast.LENGTH_SHORT).show(); } });
解决方案
30
设置完adapter后,重新计算gridview的高度,并设置给它就OK。
public static void setGrideViewHeightBasedOnChildren(GridView grid) { ListAdapter adapter = grid.getAdapter(); if (adapter == null) { return; } int totalHeight = 0; View listItem = adapter.getView(0, null, grid); listItem.measure(0, 0); if (adapter.getCount() - 1 < 0) { totalHeight = listItem.getMeasuredHeight(); } else { int line = adapter.getCount() / 3; if (adapter.getCount() % 3 != 0) line = line + 1; totalHeight = (listItem.getMeasuredHeight() + 30) * line; } ViewGroup.LayoutParams params = grid.getLayoutParams(); params.height = totalHeight + 30; ((MarginLayoutParams) params).setMargins(10, 10, 10, 10); grid.setLayoutParams(params); }
这个是本人本人根据需求写的,供参考。
10
重写一下onMeasure方法
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 expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}
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 expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);
}
}