Android笔记: 解决ScrollView嵌套ListView的冲突方法

简介:

范例:

1.MainActivity代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public  class  MainActivity  extends  Activity
{
                  
//   只要在设置ListView的Adapter后调用此静态方法Utility.setListViewHeightBasedOnChildren(listview);
//    即可让ListView正确的显示在其父ListView的ListItem中。
//    但是要注意的是,子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)
//    没有重写onMeasure(),所以会在onMeasure()时抛出异常。
                  
     private  ArrayList<String> dataList;
     private  ListView listview;
     private  ImageView img;
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
                      
         dataList =  new  ArrayList<String>();
         for  ( int  i =  0 ; i <  5 ; i++)
         {
             String str =  "第"  + i +  "行" ;
             dataList.add(str);
         }
                      
         img = (ImageView) findViewById(R.id.imageView1);
         listview = (ListView) findViewById(R.id.listView1);
                      
                      
         listview.setAdapter( new  BaseAdapter()
         {
                          
             @Override
             public  View getView( int  position, View convertView, ViewGroup parent)
             {
                 LayoutInflater inflater = getLayoutInflater();
                 View layout = inflater.inflate(R.layout.item,  null );
                 TextView tv = (TextView) layout.findViewById(R.id.tv_item);
                              
                              
                 String str = dataList.get(position);
                 tv.setText(str);
                              
                 return  layout;
             }
                          
             @Override
             public  long  getItemId( int  position)
             {
                 return  0 ;
             }
                          
             @Override
             public  Object getItem( int  position)
             {
                 return  null ;
             }
                          
             @Override
             public  int  getCount()
             {
                 return  dataList.size();
             }
         });
                      
         Utility.setListViewHeightBasedOnChildren(listview);
     }
}



2.Utility代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public  class  Utility
{
     public  static  void  setListViewHeightBasedOnChildren(ListView listView)
     {
         ListAdapter listAdapter = listView.getAdapter();
         if  (listAdapter ==  null )
         {
             // pre-condition
             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);
     }
}




本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1290605,如需转载请自行联系原作者

目录
相关文章
|
4月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
79 2
基于Android P,自定义Android开机动画的方法
|
4月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
188 2
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
59 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
79 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
97 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
47 2
|
4月前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
82 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
4月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
212 1
|
4月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
490 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
4月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
91 0