简单函数解决ListView和ScrollView冲突问题

本文介绍了ScrollView和ListView并存导致的界面展示问题及其解决方法。通过手动计算ListView的高度并设置其父布局的高度,解决了两者之间的冲突,使得界面能正确显示所有内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近开发中遇到一个问题,就是ScrollView和ListView不能并存的问题。

  有一个很长的页面(超出了手机的屏幕),上面有许多的内容。一般情况下我们会将这些控件放置在ScrollView中,当超出屏幕范围时,ScrollView会自动为我们加上垂直滚动条。但是ListView控件本身也会根据屏幕大小自动添加垂直滚动条,所以两者在一起的时候会造成冲突。

  一般表现为ListView无法正常展示全部数据,只能看到一到两个条目,如下图所示。

  官方API也建议不要将两者一起使用,但是我们确实有这样的需求怎么办呢。

  仔细观察上图可以发现ListView 没有展示完全,原因是ScrollView没能正确计算出ListView所在布局的高度。我们可以手动计算出ListView的高度,然后改变它所在布局的高度。这样ScrollView就能正常显示了。

  函数代码如下:

public void setListViewHeightBasedOnChildren(ListView listView) {  

    ListAdapter listAdapter = listView.getAdapter();   //取得listview绑定的适配器

    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();  //将所有子项的高度进行叠加

    }  

 

    ViewGroup.LayoutParams params = listView.getLayoutParams();  //取得listview所在布局的参数
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount()));  

    listView.setLayoutParams(params); //改变listview所在布局的参数

}

 

  通过测试非常简单有效,基本达到预期效果,如图:

 

  不足之处:由于手动设置了ListView所在布局的高度,当ListView高度发生变化时,如删除了一条数据。ScrollView不会自动改变高度,控件占据的位置依然存在,如图。

 

  

   接下来我们将介绍另外一种更为好用的解决方法,参见:

   自定义控件解决GridView和ScrollView冲突


   参考资料:Stack Overflow上的一篇帖子


  原文链接:http://www.67tgb.com/?p=470 

  欢迎访问:望月听涛

  

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值