1. 程式人生 > >ScrollView巢狀Listview,你會遇到的問題(1)!

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);   
    }  

下一節說明,滑動失效的問題!