网上说了2种办法:一种是重写listview和gridview。不过这个方法有个问题,如果你的listview或者gridview设置了分割线高度。最后的计算结果会忽略掉分割线的高度,导致现实不全。
第二种方法是写一个工具类对listview的高度进行重算,计算完设置listview的高度,这个方法试过可行,有把分割线也计算进去。不过网上都是 listview的计算。缺少gridview的,因此在这里补充上。由于gridview计算的高度不能直接根据数据总数,需要判断每行显示的个数。以 及最后一行是否全部显示。需要多几个判断。代码如下:
计算listview高度的代码
public static void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { // pre-condition 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(); // 统计所有子项的总高度 } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); // listView.getDividerHeight()获取子项间分隔符占用的高度 // params.height最后得到整个ListView完整显示需要的高度 listView.setLayoutParams(params); }
计算gridview高度的代码
public static void setGridViewHeightBasedOnChildren(GridView gridView) { // 获取GridView对应的Adapter ListAdapter listAdapter = gridView.getAdapter(); if (listAdapter == null) { return; } int rows; int columns=0; int horizontalBorderHeight=0; Class<?> clazz=gridView.getClass(); try { //利用反射,取得每行显示的个数 Field column=clazz.getDeclaredField("mRequestedNumColumns"); column.setAccessible(true); columns=(Integer)column.get(gridView); //利用反射,取得横向分割线高度 Field horizontalSpacing=clazz.getDeclaredField("mRequestedHorizontalSpacing"); horizontalSpacing.setAccessible(true); horizontalBorderHeight=(Integer)horizontalSpacing.get(gridView); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } //判断数据总数除以每行个数是否整除。不能整除代表有多余,需要加一行 if(listAdapter.getCount()%columns>0){ rows=listAdapter.getCount()/columns+1; }else { rows=listAdapter.getCount()/columns; } int totalHeight = 0; for (int i = 0; i < rows; i++) { //只计算每项高度*行数 View listItem = listAdapter.getView(i, null, gridView); listItem.measure(0, 0); // 计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度 } ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = totalHeight+horizontalBorderHeight*(rows-1);//最后加上分割线总高度 gridView.setLayoutParams(params); }