ScrollView中嵌套使用ListView,GridView
来源:互联网 发布:太原市知达常青藤学校 编辑:程序博客网 时间:2024/05/16 15:06
出处:http://m.blog.csdn.net/blog/yhc13429826359/39058973
在之前的编程里,我还没有遇到过要在一个ListView中嵌套一个GridView或是在一个GridView中嵌套一个ListView。所以今天事儿来了!我花了一将近3个小时,找到了为什么我在一个ListView中添加一个GridView时,只显示一行GridView的原因;另外,这3个小时的付出,又让我学会了另一件事——在局部找不到原因的时候,要跳出来,从更大的范围寻找原因。废话了这么多,那么究竟是为什么只显示一行GridView呢?
因为在Android中,有这样一个限制,两ScrollView型的控件不能相互嵌套。像ListView和GridView就都是ScrollView型的控件。因为嵌套后,两个ScrollView型控件的滑动效果就丧失了,同时被嵌套控件的高度也被限定为一行的高度。那我们还能不能嵌套两个ScrollView型的控件呢?肯定是可以的。方法有两种:一是我们去需要自定义ListView或是GridView,并重写其onMeasure()方法。如下:
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的高度,然后计算总高度。具体代码如下:
<span style="white-space:pre"></span>/** * 重新计算listView高度 * @param listView */public static void setListViewHeightBasedOnChildren(ListView listView) {// 获取ListView对应的AdapterListAdapter 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的衍生类里。代码如下:
<span style="white-space:pre"></span>/** * 计算gridview高度 * @param gridView */public static void setGridViewHeightBasedOnChildren(GridView gridView) {// 获取GridView对应的AdapterListAdapter 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 exceptione.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);}
这样我们就可以在ListView中添加GridView了。。。
注:两个SrcollView型的控件可以是:
<ListView, GridView>;
<GridView,ListView>;
<ListView,ListView>;
<GridView, GridView>;
<ListView, ScrollView>;
<ScrollView,ListView>;
<GridView, ScrollView>;
<ScrollView, GridView>;
<ScrollView, ScrollView>;
- ScrollView中嵌套使用ListView,GridView
- ScrollView中嵌套ListView,GridView
- ScrollView嵌套GridView、ListView
- ScrollView嵌套ListView、GridView
- ScrollView 嵌套 ListView GridView
- ScrollView中嵌套GridView,Listview的办法
- ScrollView中嵌套GridView,Listview的办法
- ScrollView中嵌套GridView,Listview的办法
- ScrollView中嵌套GridView,Listview的办法
- ScrollView中嵌套GridView,Listview的办法
- ScrollView中嵌套GridView,Listview的办法
- Android ScrollView中嵌套GridView,ListView
- android中ListView嵌套GridView,或者ScrollView嵌套GridView
- scrollview嵌套listview,gridview时使用自定义listview或gridview
- 如何在ScrollView中嵌套ListView、ScrollView、EditText、GridView
- 如何在ScrollView中嵌套ListView、ScrollView、EditText、GridView
- ScrollView嵌套ListView,GridView;ListView嵌套ListView,GridView;ExpanderListView嵌套...
- ScrollView嵌套GridView和ListView
- 27-网络编程-24-网络编程(常见网络结构)
- hdu 1671 Trie树简单应用
- MongoDB源码概述——内存管理和存储引擎
- H.264无符号整数指数哥伦布码编码
- C++之 继承后的访问控制
- ScrollView中嵌套使用ListView,GridView
- HTML转义字符
- The eco friendly film faced plywood
- Handler与looper、MessageQueue的关系
- MyReport.Form运算符函数说明文档
- I学霸官方免费教程十八:Java常用类之Object类
- 五步搞定Android开发环境部署
- linux设备驱动归纳总结(三):1.字符型设备之设备申请
- x264中bs.h文件部分函数解读