Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 454|回复: 0

Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-7-21 13:38:45 | 显示全部楼层 |阅读模式

    是这样的哈:

    有这样一个需求:

      1.显示一个界面,界面上有一个列表(ListView),列表上面有一个可以滚动的海报。

      2.要求在ListView滚动的过程中,ListView上面的海报也可以跟着ListView滚动。

    我们的一般解决方案:

    1.使用ScrollView嵌套这一个ListView。

    对,这样的布局本身是没哟什么问题的。但是问题来了,当你运行你的界面的时候,突然发现,你的列表中明明有好多项,但是为什么只显示一项呢?仔细检查你会发现,不是列表只显示一项,而是其它的项被布局本身遮住了。

     

     

    怎么办呢?下面将给出两种相对简单的解决方案:

    第一种:禁用ListView的滚动(Scroll)。

    第二种:计算ListView中每一项的高度,然后根据每一项的高度“乘以”项数,计算出ListView的总高度。

     

    下面给出第一种方法的代码展示:

    import android.widget.ListView;
    
    public class MyListView extends ListView{
        public MyListView(android.content.Context context,android.util.AttributeSet attrs){  
            super(context, attrs);  
        }  
        /** 
         * 设置不滚动 
         */  
        public void onMeasure(int widthMeasureSpec, int heightMeasureSpec)  
        {  
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
                    MeasureSpec.AT_MOST);  
            super.onMeasure(widthMeasureSpec, expandSpec);  
      
        }  
    }

    以下是第二种方法的的代码:

    /**动态改变listView的高度*/
        public void setListViewHeightBasedOnChildren(ListView listView) {
              ListAdapter listAdapter = listView.getAdapter();
              if (listAdapter == null) {
               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();
    //           totalHeight += 80;
              }
              ViewGroup.LayoutParams params = listView.getLayoutParams();
    //          params.height = 80 * (listAdapter.getCount() - 1);
    //          params.height = 80 * (listAdapter.getCount());
              params.height = totalHeight
                + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
              ((MarginLayoutParams) params).setMargins(0, 0, 0, 0);
              listView.setLayoutParams(params);
              
             }


    到此为止问题结束。如果哪位朋友有更好的解决办法,别忘了提出来分享一下哈。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-9 08:15 , Processed in 0.062417 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表