ScrollView中嵌套ListView或GridView,只显示一行
2016-07-28 16:16
459 查看
在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行的高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其onMeasure()方法。
如下:
ListView也同理。还有一种方法是我们重新动态地计算我们现在需要的高度。在我们调用Adapter的时候,我们获得现在这个时候的GridView有多少个,单个GridView的高度,然后计算总高度。具体代码如下:
在我们setAdapter()的之前,我们调用上面的方法,如setListViewHeightBasedOnChildren(accomplishmentStateListView);因为我是在ListView中嵌套GridView,所以重新计算GridView的总高度的时候,要放在setAdapter(…GridViewAdapter)这个BaseAdapter的衍生类里。代码如下:
如下:
public class NoScrollGridView extends GridView { public NoScrollGridView(Context context) { super(context); } public NoScrollGridView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
ListView也同理。还有一种方法是我们重新动态地计算我们现在需要的高度。在我们调用Adapter的时候,我们获得现在这个时候的GridView有多少个,单个GridView的高度,然后计算总高度。具体代码如下:
/** * 重新计算listView高度 * @param listView */ public static void setListViewHeightBasedOnChildren(ListView listView) { // 获取ListView对应的Adapter ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) { 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); }
在我们setAdapter()的之前,我们调用上面的方法,如setListViewHeightBasedOnChildren(accomplishmentStateListView);因为我是在ListView中嵌套GridView,所以重新计算GridView的总高度的时候,要放在setAdapter(…GridViewAdapter)这个BaseAdapter的衍生类里。代码如下:
/** * 计算gridview高度 * @param 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); }
相关文章推荐
- iOS-UI分析利器--Reveal安装破解以及简单使用
- Win10引发的 wamp集成包启动不了
- 【学习】js学习笔记:对象的一些基础知识
- checkbox样式自定义
- Android Integer.decode()和Intger.valueof()
- Android中android:visibility的3中属性的剖析
- 写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。
- 倒排索引篇
- shared_ptr
- Android5.0 CollapsingToolbarLayout 基本使用
- PM 创建设备 函数 EQUIPMENT_SAVE
- java实现简单的单点登录
- 修改mysql数据库编码
- Linux入门:常用命令:curl用法【等待后续添加】
- ubuntu server 14.04 编译安装xen4.4.2配置vtpm(三)——创建DomU(a PV VM)
- jquery之动态级联下拉列表
- 过滤特殊字符
- DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)
- Oracle trunc()函数的用法
- java调用oracle中输入参数是数组类型的函数或者存储过程