ScrollView+ListView滚动冲突,没有滑动效果 解决办法

问题背景

  • 今天做个界面需要在整个布局都要滚动的基础上添加一个ListView元素,整个布局滚动当然用ScrollView。但是在ScrollView+ListView的布局画好后,发现整个界面都无法滚动,而且ListView只显示了第一条元素。
  • 查看布局提示:The vertically scrolling ScrollView should not contain another vertically scrolling widget (ListView)。

问题分析:

  • 由上面那个提示可以看到,正常情况下ScrollView下是不允许再包含一个可滑动的View的,为什么呢?
  • 首先要了解ScrollView的工作原理,我们常用它来布局一个内容超过当前页面,需要往下滑才能看到完整内容。
  • 在这里,我们可以把ScrollView看作是一种特殊的、加长版的LinearLayout(虽然它的布局不一定是线性的,但为了便于理解我们暂且这样看),加长?有多长?
  • 系统在加载布局时其实要知道整个布局的长度,也就是上面加长后的长度,才能将整个页面显示出来。而ListView我们知道,item个数是会动态变化的,如果在ScrollView中加入ListView会让系统无法准确加载,导致了我们开始遇到的那种情况。
  • 查询很多资料后,得到了这个解决办法:

一种解决办法:

  • 有网友试过,将ListView的layout_height设置为一个定值,比如说400dp,就可以有滑动的效果。
  • 但是ListView只能显示部分元素,这不是我们想要的结果。
  • 所以就需要一种方法可以根据ListView中Item数量,动态设置ListView的height,使全部item得到显示。

最终解决方法:

<code class="hljs java has-numbering">    <span class="hljs-javadoc">/**
     * scrollview与listview合用会出现listview只显示一行多点。此方法是为了定死listview的高度就不会出现以上状况
     * 算出listview的高度
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setListViewHeight</span>(ListView listView) {
        ListAdapter listAdapter = listView.getAdapter();
        <span class="hljs-keyword">if</span> (listAdapter == <span class="hljs-keyword">null</span>) {
            <span class="hljs-keyword">return</span>;
        }
        <span class="hljs-keyword">int</span> totalHeight = <span class="hljs-number">0</span>;
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>; i < listAdapter.getCount(); i++) {
            View listItem = listAdapter.getView(i, <span class="hljs-keyword">null</span>, listView);
            listItem.measure(<span class="hljs-number">1</span>, <span class="hljs-number">1</span>);
            totalHeight += listItem.getMeasuredHeight();
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - <span class="hljs-number">1</span>)) + listView.getPaddingTop() + listView.getPaddingBottom();
        listView.setLayoutParams(params);
    }
原文地址:http://blog.csdn.net/u011240877/article/details/46051669?ref=myread
</code>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值