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 避免在同一机器上运行同一程序的多个实例