ScrollView嵌套Listview,你会遇到的问题(1)!

做开发的时候,把两个都能滑动的控件(同方向滑动),总会遇到滑动事件冲突的状况,有时候会滑动失效,有时候会显示不正常。这里讲讲ScrollView嵌套Listview可能会出现的问题。
问题描述:

<ScrollView   
        android:layout_width="match_parent"   
        android:layout_height="match_parent" >   
        <LinearLayout   
            android:layout_width="match_parent"   
            android:layout_height="match_parent" >   
            <ListView   
                android:id="@+id/listView"   
                android:layout_width="match_parent"   
                android:layout_height="match_parent"   
                android:fadingEdge="vertical"   
                android:fadingEdgeLength="5dp" />   
        </LinearLayout>   
    </ScrollView>   

你在ScrollView放了一个Listview,它们两个的高度属性都是match_parent,但是,你的ListView死活就是只给你显示一行,无论怎么设置高度。你怕不怕?
其实只要找到原因了,问题自然好解决。
很显然,listview不知道自己的高度了。为什么会这样的原因?因为listview要根据ParentView来来计算自己所处的位置和高度的。把
listview在ScrollView中,ScrollView的高度是很高很高的。所以他才可以包裹很多内容让你滑动,这不,ListView就懵逼了,它不知道自己该有多高。你只要告诉它,它有多高就行了。
计算挺简单的,不多说,重要的是上面的原因,具体怎么体现的。自己好好想想。

    public void setListViewHeightBasedOnChildren(ListView listView) {   
        // 获取ListView对应的Adapter   
        ListAdapter listAdapter = listView.getAdapter();   
        if (listAdapter == null) {   
            return;   
        }   

        int totalHeight = 0;   
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) {   
            // listAdapter.getCount()返回数据项的数目   
            View listItem = listAdapter.getView(i, null, listView);   
            // 计算子项View 的宽高   
            listItem.measure(0, 0);    
            // 统计所有子项的总高度   
            totalHeight += listItem.getMeasuredHeight();    
        }   

        ViewGroup.LayoutParams params = listView.getLayoutParams();   
        params.height = totalHeight+ (listView.getDividerHeight() * (listAdapter.getCount() - 1));   
        // listView.getDividerHeight()获取子项间分隔符占用的高度   
        // params.height最后得到整个ListView完整显示需要的高度   
        listView.setLayoutParams(params);   
    }  

下一节说明,滑动失效的问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值