(转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法
2015-04-05 17:27
260 查看
即动态获取ListView和GridView的高度
一、对于ListView
ListView listview= new ListView(this);
setListViewHeightBasedOnChildren(listview);即可
二、对于GridView
GridView gridview = new GridView(this);
setGridViewHeightBasedOnChildren(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 = 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
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=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); }
相关文章推荐
- Android在RecyclerView/ScrollView中嵌套一个GridView或者recyclerView时只显示一行的原因及解决方法
- Android在ListView中嵌套一个GridView时只显示一行的原因及解决方法
- ScrollView中嵌套ListView或者GridView时的滑动冲突 || ListView中嵌套GridView,GridView只显示一行的问题解决
- Android在ListView中嵌套一个GridView时只显示一行的原因及解决方法
- 关于ScrollView中嵌套GridVIew只显示一行解决方法以及GridView行高计算方法
- Android在ListView中嵌套一个GridView时只显示一行的原因及解决方法
- Android在ListView中嵌套一个GridView时只显示一行的原因及解决方法
- Ubuntu下pdf、gedit、vim 中文无法读取或者显示乱码的解决方法
- Ubuntu下pdf、gedit、vim 中文无法读取或者显示乱码的解决方法
- ASP.NET 当GridView中没有数据的时候,显示标题栏 并且给出一行数据提示 (两种方法)
- PDF不显示汉字或者显示方框解决方法
- 虚拟机下全屏时另一屏幕不显示或者花屏解决方法
- 导出excel身份证过长导致显示不正常自定义单元格格式解决方法
- GridView绑定数据源,无记录时表头也显示的一种解决方法
- 没清除DataGridView列所导致列数显示混乱的解决方法
- Win7桌面图标显示不正常或者显示错误的解决方法
- 关于CSS中内层使用float导致外层的背景无法显示的问题的解决方法
- jsp导出excel身份证过长导致显示不正常自定义单元格格式解决方法
- VC2010 中 MFC 的改进导致 XTP 停靠窗体无法显示的解决方法
- Android GridView 一行显示数据(包括图片和文本),解决的办法是计算数据占该行的宽度是多少