scrollview与listview、gridview嵌套高度冲突解决思路
网上说了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); }
最后更新:2017-04-03 06:03:05
上一篇:
解决:<net.sf.ehcache.util.UpdateChecker> : New update(s) found: 2.6.5
下一篇:
iPhone开发初探
无人驾驶、配送机器人背后的技术 - PostGIS点云(pointcloud)应用实践
创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]
SSH2->Spring Framework2 struts2 hibernate
"太极大师”战不过10秒,武术大师连广场舞大妈都打不过? 武术已成热点话题!
Tomcat的设置1——设置根目录
JSTL提供的函数标签操作EL表达式字的符串
Oracle中imp命令使用出错——未知命令开头
HTAP数据库 PostgreSQL 场景与性能测试之 9 - (OLTP) 字符串模糊查询 - 含索引实时写入
1到n的全排列
【进程线程与同步】5.2 避免在同一机器上运行同一程序的多个实例