Android笔记之:在ScrollView中嵌套ListView的方法
2023-06-13 09:14:59 时间
前几天因为项目的需要,要在一个ListView中放入另一个ListView,也即在一个ListView的每个ListItem中放入另外一个ListView。但刚开始的时候,会发现放入的小ListView会显示不完全,它的高度始终有问题。上网查了下,发现别人也有遇到这样的问题,而大多数人都不推荐这样的设计,因为默认情况下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是无法计算的。
又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过试验发现是可以解决问题的,它的思路就是在设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为LayoutParams设置给ListView,这样它的高度就正确了.
以下是源码:
复制代码代码如下:
又搜索了一下,发现有StackOverflow上的牛人已经解决了这个问题,经过试验发现是可以解决问题的,它的思路就是在设置完ListView的Adapter后,根据ListView的子项目重新计算ListView的高度,然后把高度再作为LayoutParams设置给ListView,这样它的高度就正确了.
以下是源码:
publicclassUtility{
publicstaticvoidsetListViewHeightBasedOnChildren(ListViewlistView){
ListAdapterlistAdapter=listView.getAdapter();
if(listAdapter==null){
//pre-condition
return;
}
inttotalHeight=0;
for(inti=0;i<listAdapter.getCount();i++){
ViewlistItem=listAdapter.getView(i,null,listView);
listItem.measure(0,0);
totalHeight+=listItem.getMeasuredHeight();
}
ViewGroup.LayoutParamsparams=listView.getLayoutParams();
params.height=totalHeight+(listView.getDividerHeight()*(listAdapter.getCount()-1));
listView.setLayoutParams(params);
}
}
只要在设置ListView的Adapter后调用此静态方法即可让ListView正确的显示在其父ListView的ListItem中。但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。
在ScrollView中嵌套ListView(或者ScrollView)的另外一个问题就是,子ScrollView中无法滑动的(如果它没有显示完全的话),因为滑动事件会被父ScrollView吃掉,如果想要让子ScrollView也可以滑动,只能强行截取滑动事件,有牛人在论坛中发过代码说可以。虽然我没有亲自试过,但估计是可行的。
虽然在ScrollView中显示ScrollView在技术上的难题可以攻破,但是这样的设计却是非常差的用户体验因为用户会不容易看到和操作子ScrollView中的内容。比如好的设计是,父ListView的每个Item只显示概括性的描述,然后点击其Item会进入另外一个页面来详细描述和展示以及对这个Item的操作。
相关文章
- android开发笔记之 Android代码混淆打包
- android onresume方法,Android onActivityResult()和onResume()的执行顺序
- 工厂方法模式及在Android源码中的应用
- Android开发中,怎样调用摄像机拍照以及怎样从本地图库中选取照片
- android toast全屏,Android Toast实现全屏显示
- android toast点击事件_android生命周期七种方法
- Android - NETD解读
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
- 【Android 性能优化】应用启动优化 ( 方法追踪代码模板 | 示例项目 | SD 卡访问权限 | 示例代码 | 获取 Trace 文件 | Android Studio 查看文件)
- 【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
- 【Android 安装包优化】7z 文件压缩格式 ( 7z 格式简介 | 7z 命令使用说明 )
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
- 【Android 逆向】x86 汇编 ( cmp 比较指令 | test 比较指令 )
- 【Android 逆向】Dalvik 函数抽取加壳 ③ ( 类加载流程分析 | DexPathList#findClass 函数分析 | DexFile#loadClassBinaryName函数 )
- 【Android UI】贝塞尔曲线 ④ ( 使用 android.graphics.Path 提供的 cubicTo 方法绘制三阶贝塞尔曲线示例 )
- Android编程开发基本规范和原则详解手机开发
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局详解手机开发
- [android] 轮播图-滑动图片标题焦点详解手机开发
- Android开发笔记改变字体颜色的三种方法
- Android开发旋转屏幕导致Activity重建解决方法
- android之自定义Toast使用方法
- Android图片特效:黑白特效、圆角效果、高斯模糊
- Android开发笔记之:复写按钮方法
- android弹出activity设置大小的方法
- android权限大全分享
- 浅析android中的线程封装
- Android中的jQuery:AQuery简介
- Android开发中的9个常见错误和解决方法
- Android获得当前正在显示的activity类名的方法