天天看點

日積月累:ScrollView嵌套ListView隻顯示一行

在開發的過程當中,由于手機螢幕的大小的限制,我們經常需要使用滑動的方式,來顯示更多的内容。在最近的工作中,遇見一個需求,需要将listview嵌套到scrollview中顯示。于是乎有了如下布局: 

[html] ​​view plain​​​​copy​​

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"   

    xmlns:tools="http://schemas.android.com/tools"   

    android:layout_width="match_parent"   

    android:layout_height="match_parent"   

    android:background="#ffe1ff"   

    android:orientation="vertical" >   

    <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/listview1"   

                android:layout_width="match_parent"   

                android:layout_height="match_parent"   

                android:fadingedge="vertical"   

                android:fadingedgelength="5dp" />   

        </linearlayout>   

    </scrollview>   

</linearlayout>   

運作程式,如下結果,無論你如何調整layout_width,layout_height屬性,listview清單隻顯示一列! 

日積月累:ScrollView嵌套ListView隻顯示一行

在查閱的各種文檔和資料後,發現在scrollview中嵌套listview空間,無法正确的計算listview的大小,故可以通過代碼,根據目前的listview的清單項計算清單的尺寸。實作代碼如下: 

[java] ​​view plain​​​​copy​​

public class mainactivity extends activity {   

    private listview listview;   

    @override   

    protected void oncreate(bundle savedinstancestate) {   

        super.oncreate(savedinstancestate);   

        setcontentview(r.layout.activity_main);   

        listview = (listview) findviewbyid(r.id.listview1);   

        string[] adapterdata = new string[] { "afghanistan", "albania",… … "bosnia"};   

        listview.setadapter(new arrayadapter<string>(this,android.r.layout.simple_list_item_1,adapterdata));   

        setlistviewheightbasedonchildren(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);   

}   

運作結果,ok問題搞定,打完收工! 

日積月累:ScrollView嵌套ListView隻顯示一行