即动态获取ListView和GridView的高度

一、对于ListView

ListView listview= new ListView(this);

setListViewHeightBasedOnChildren(listview);即可

 public static void setListViewHeightBasedOnChildren(ListView listView) {
// 获取ListView对应的Adapter
ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
// pre-condition
return;
} int totalHeight = ;
for (int i = , len = listAdapter.getCount(); i < len; i++) { // listAdapter.getCount()返回数据项的数目
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(, ); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
} ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (listAdapter.getCount() - ));
// listView.getDividerHeight()获取子项间分隔符占用的高度
// params.height最后得到整个ListView完整显示需要的高度
listView.setLayoutParams(params);
}

二、对于GridView

GridView gridview = new GridView(this);

setGridViewHeightBasedOnChildren(gridview );即可

 public static void setGridViewHeightBasedOnChildren(GridView gridView) {
// 获取GridView对应的Adapter
ListAdapter listAdapter = gridView.getAdapter();
if (listAdapter == null) {
return;
}
int rows;
int columns=;
int horizontalBorderHeight=;
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>){
rows=listAdapter.getCount()/columns+;
}else {
rows=listAdapter.getCount()/columns;
}
int totalHeight = ;
for (int i = ; i < rows; i++) { //只计算每项高度*行数
View listItem = listAdapter.getView(i, null, gridView);
listItem.measure(, ); // 计算子项View 的宽高
totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度
}
ViewGroup.LayoutParams params = gridView.getLayoutParams();
params.height = totalHeight+horizontalBorderHeight*(rows-);//最后加上分割线总高度
gridView.setLayoutParams(params);
}

最新文章

  1. Photon服务器进阶&amp;一个新游戏的出产(一)
  2. 如何做好一个ORM框架
  3. thinkphp 项目分组 -开发随笔1
  4. BZOJ3672 : [Noi2014]购票
  5. POJ 2112 Optimal Milking(最大流+二分)
  6. Java基础——常用类(Date、File)以及包装类
  7. 从一个URL下载原始数据,基于byte字节,得到byte数组
  8. 斯坦福IOS开发第五课(第一部分)
  9. 自定义完美的ViewPager 真正无限循环的轮播图
  10. javascript高级程序语言学习笔记
  11. solr string类型表示不支持分词
  12. java中String类型
  13. Java高频面试题
  14. Redis分布式锁的实现
  15. subversion &amp; MacOS &amp; Xcode 10
  16. (69)Wangdao.com第十一天_JavaScript 指定函数对象的 this 上下文对象
  17. Linux下批量管理工具pssh使用记录
  18. Qt如何获得窗口的几何信息(Window Geometry)
  19. Throwing Dice(概率dp)
  20. webpack@3.6.0(1) -- 快速开始

热门文章

  1. 直接把数据库中的数据保存在CSV文件中
  2. codeforces D. Design Tutorial: Inverse the Problem
  3. iOS-UIScrollView-图片缩放
  4. CentOS6.5菜鸟之旅:VirtualBox4.3识别USB设备
  5. IE11之F12 Developer Tools--调试器(Debugger)
  6. Scrum 项目7.0--软件工程
  7. Python基础:序列
  8. 重新想象 Windows 8 Store Apps (54) - 绑定: 增量方式加载数据
  9. 使用layout_weight设置控件占屏幕百分比
  10. treap树---Double Queue