利用反射获取GridView的高度
来源:互联网 发布:淘宝女装2016top排行榜 编辑:程序博客网 时间:2024/06/04 20:03
本篇文章基于 之前的一篇判断ListView的每一个item高度
直接复用上一篇文章中的setListViewHeightBasedOnChildren方法,当初是使用gridView.getNumColumns();方法,获取gridview的列数,但是当我断点看的时候,发现值一直是-1, 而gridview中的mRequestedNumColumns字段反而是正常的, 看看gridview的源码中的setNumColumns方法,它把mRequestedNumColumns字段赋值了。
/** * Set the number of columns in the grid * * @param numColumns The desired number of columns. * * @attr ref android.R.styleable#GridView_numColumns */ public void setNumColumns(int numColumns) { if (numColumns != mRequestedNumColumns) { mRequestedNumColumns = numColumns; requestLayoutIfNecessary(); } }
然后在 determineColumns中也看到了对mNumColumns的赋值。
private boolean determineColumns(int availableSpace) { final int requestedHorizontalSpacing = mRequestedHorizontalSpacing; final int stretchMode = mStretchMode; final int requestedColumnWidth = mRequestedColumnWidth; boolean didNotInitiallyFit = false; if (mRequestedNumColumns == AUTO_FIT) { if (requestedColumnWidth > 0) { // Client told us to pick the number of columns mNumColumns = (availableSpace + requestedHorizontalSpacing) / (requestedColumnWidth + requestedHorizontalSpacing); } else { // Just make up a number if we don't have enough info mNumColumns = 2; } } else { // We picked the columns mNumColumns = mRequestedNumColumns; } if (mNumColumns <= 0) { mNumColumns = 1; } ...省略若干行代码... }
并且这个值就没有再改过。不知道为什么一直是-1.好吧,暂时先不管,晚上回去再看看。先把问题解决了再说。既然mRequestedNumColumns有值, 那我们直接通过反射拿到这个字段的值吧,看源码。
public static void setGridViewHeightBasedOnChildren(GridView gridView, View... views) { //获取对应的adapter ListAdapter listAdapter = gridView.getAdapter(); Class<GridView> tempGridView = GridView.class; // 获得gridview这个类的class int column = -1; try { Field field = tempGridView.getDeclaredField("mRequestedNumColumns"); // 获得申明的字段 field.setAccessible(true); // 设置访问权限 column = Integer.valueOf(field.get(gridView).toString()); // 获取字段的值 } catch (Exception e1) { } if (column == -1) return; if (listAdapter == null) { // pre-condition return; } int totalHeight = 0; for (int i = 0, len = listAdapter.getCount(); i < len; i += column) { // 这边因为一排column个,所以i // += // column View listItem = listAdapter.getView(i, null, gridView); listItem.measure(0, 0); // 计算子项View 的宽高 totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度 } try { if (views != null) { for (View view : views) { view.measure(0, 0); totalHeight += view.getMeasuredHeight(); } } } catch (Exception e) { e.printStackTrace(); } ViewGroup.LayoutParams params = gridView.getLayoutParams(); params.height = totalHeight + (gridView.getHeight() * (listAdapter.getCount() - 1)) + 10; gridView.setLayoutParams(params); }
好了,这个时候 gridview的高度就获得了。当然,我这里由于业务的需求,直接把高度重新设置到了gridview的身上, 按照自己的需求,修改就行了。
关注我的微信公众号 Android开发者 微信号: andeoidesigner 或者扫描下方二维码
0 0
- 利用反射获取GridView的高度
- 获取gridView的高度
- Android利用反射获取状态栏(StatusBar)高度
- Android利用反射获取状态栏(StatusBar)高度
- 通过反射机制获取状态栏的高度
- android通过反射获取状态栏的高度
- 获取标题栏高度(反射)
- 获取ListView/GridView当前滚动的距离(高度)
- 利用反射获取类的属性名称
- C#利用反射获取属性的值
- 如何利用反射获取字段的数据
- 利用反射获取SQL数据库的对象
- 利用HTML控件获取GridView中CheckBox的值
- 获取状态栏高度(运用反射)
- 利用反射获取与修改private的属性的值
- 利用Class反射获取方法
- Java 利用反射获取方法
- 利用Java反射获取类的私有变量值
- [汇编] 汇编语言实现简易文本编辑器(光标移动、上卷和退格删除)
- 绕过js-sdk,微信转发的时候在标题添加时间和地点。
- 多线程:NSThread
- QString转char*
- keil4 进行 S3C2440裸机开发
- 利用反射获取GridView的高度
- 第十三周 阅读程序 运用虚函数的用后对比及讲解(2)
- HDU 1847 (迪杰斯特拉)
- iOS 视图约束常用的宏定义
- android enum 枚举属性传值
- Java NIO通信框架在电信领域的实践
- git的用法
- HDU--2021
- LeetCode Longest Substring Without Repeating Characters