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,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
81 15
Android 系统缓存扫描与清理方法分析
|
2月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
85 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开发知识可参考相关书籍。
116 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
51 2
|
4月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
241 1
|
4月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
607 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
4月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
133 0
|
Android开发
Android Studio 滚动视图ScrollView使用与全屏实例
本文目录 1. 使用场景 2. 注册页面实例 3. ScrollView填满窗口
964 0
Android Studio 滚动视图ScrollView使用与全屏实例
|
Android开发
Android零基础入门第61节:滚动视图ScrollView
原文:Android零基础入门第61节:滚动视图ScrollView    前面几期学习了ProgressBar系列组件、ViewAnimator系列组件、Picker系列组件和时间日期系列组件,接下来几期继续来学习常见的其他组件。
1768 0