ListView与GridView自适应高度,与Bug解决gridView.getNumColumns() = -1
2017-01-11 15:28
483 查看
ListView自适应:
public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } int totalHeight = 0; for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); }
GridView自适应,存在Bug待解决
// listView.getNumColumns() = -1?; 始终返回 -1;
public static void setListViewHeightBasedOnChildren(GridView listView) { // 获取listview的adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { return; } // 固定列宽,有多少列 int col = 3; // listView.getNumColumns() = -1?; // i每次加4,相当于listAdapter.getCount()小于等于4时 循环一次,计算一次item的高度, // listAdapter.getCount()小于等于8时计算两次高度相加 /*for (int i = 0; i < listAdapter.getCount(); i += col) { // 获取listview的每一个item View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); // 获取item的高度和 totalHeight += listItem.getMeasuredHeight(); }*/ View listItem = listAdapter.getView(0, null, listView); listItem.measure(0, 0); // 获取item的高度和 int totalHeight = listItem.getMeasuredHeight(); // 获取listview的布局参数 ViewGroup.LayoutParams params = listView.getLayoutParams(); if (listAdapter.getCount() % col != 0) { totalHeight = totalHeight * (listAdapter.getCount() / col + 1); } else { totalHeight = totalHeight * (listAdapter.getCount() / col); } // 设置高度 params.height = totalHeight; // 设置margin ((MarginLayoutParams) params).setMargins(10, 10, 10, 10); // 设置参数 listView.setLayoutParams(params); }debug中在这里发现mRequestedNumColumns 能正确获得colums num值,所以想通过反射获取该值插入;
Field field = GridView.class.getDeclaredField("mRequestedNumColumns"); // 获得申明的字段field.setAccessible(true); // 设置访问权限column = Integer.valueOf(field.get(gridView).toString()); // 获取字段的值剩下的就简单了!!!
相关文章推荐
- ListView 与 GridView 在ScrollView中自适应高度
- Android ListView自适应高度和ScrollView冲突解决 [有效]
- ListView不能自适应高度全屏的解决方法(可能是最完美的解决方案)
- Android ListView高度自适应和ScrollView冲突解决
- ScrollView嵌套ListView或GridView等,使得其高度自适应解决方案
- GridView 和ListView中自适应高度
- 解决GridView,ListView嵌套在ScrollView时只显示一行高度的问题
- scrollview与listview、gridview嵌套高度冲突解决办法(优化版)
- 解决GridView,ListView嵌套在ScrollView时只显示一行高度的问题
- 深入理解布局容器绘制,解决ListView嵌套listview,或者ScrollView嵌套listview,gridview的高度问题解决方法
- scrollview与listview、gridview嵌套高度冲突解决思路
- Android GridView之添加分隔线,动态设置高度,实现高度自适应,并解决第一个item不显示的问题
- ExpandableListView 里面嵌套GridView实现高度自适应
- Android中ListVIew高度自适应,解决ScrollView冲突问题以及Android表格
- ListView(ScrollView)嵌套ListView、GridView显示不全,内容大于一行计算的高度不正确的解决办法
- ListView和GridView根据item数量自适应高度的工具类封装
- CSS布局自适应高度解决方法
- ExtJs非Iframe框架加载页面实现 解决自适应高度
- 解决层的自适应高度一 -------------------用js来控制
- iframe 自适应高度问题解决方法