网上很多文章都说自订一个list
@Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }
但是发现这样会有问题,当我的gridview重新notify后,计算的高度会出问题,直接用系统自带的view就好了,我们重新计算view的高度
/** * 适配器最外围布局必须是线性布局 重新计算listview的宽高 * * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { if (listView.getChildCount() > 0) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目 View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); // 计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度 } LinearLayout.LayoutParams params = (LayoutParams) listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); // listView.getDividerHeight()获取子项间分隔符占用的高度 // params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); } } /** * 适配器最外围布局必须是线性布局 重新计算gridView的宽高 * * @param */ public static void setGradeViewHeightBasedOnChildren(GridView gridView, int col) { double hightcount = Math.ceil((double) gridView.getAdapter().getCount() / (double) col); int height = 0;int maxheight = 0; for (int i = 0, len = gridView.getAdapter().getCount(); i <= len; i++) { // listAdapter.getCount()返回数据项的数目 View listItem = gridView.getAdapter().getView(i, null, gridView); listItem.measure(0, 0); // 计算子项View 的宽高 height = listItem.getMeasuredHeight(); if(maxheight <= height) maxheight = height; } // 获取gridView的布局参数 ViewGroup.LayoutParams params = gridView.getLayoutParams(); // 设置高度 params.height = (int) (hightcount * maxheight + 30);// 设置margin ((ViewGroup.MarginLayoutParams) params).setMargins(30, 30, 30, 30); // 设置参数 gridView.setLayoutParams(params);}