天天看點

關于ListView嵌套的問題

關于ListView嵌套的問題

(2012-07-06 13:37:16)

關于ListView嵌套的問題

轉載▼

标簽:

 轉自http://tangweiye.iteye.com/blog/1434389

  前幾天因為項目的需要,要在一個listview中放入另一個listview,也即在一個listview的每個listitem中放入另外一個listview。但剛開始的時候,會發現放入的小listview會顯示不完全,它的高度始終有問題。上網查了下,發現别人也有遇到這樣的問題,而大多數人都不推薦這樣的設計,因為預設情況下android是禁止在scrollview中放入另外的scrollview的,它的高度是無法計算的。

     又搜尋了一下,發現有stackoverflow上的牛人已經解決了這個問題,經過試驗發現是可以解決問題的,它的思路就是在設定完listview的adapter後,根據listview的子項目重新計算listview的高度,然後把高度再作為layoutparams設定給listview,這樣它的高度就正确了,以下是源碼:

java代碼

關于ListView嵌套的問題
關于ListView嵌套的問題
關于ListView嵌套的問題

public class utility {     

    public static void setlistviewheightbasedonchildren(listview listview) {     

        listadapter listadapter = listview.getadapter();      

        if (listadapter == null) {     

            // pre-condition     

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

        params.height = totalheight + (listview.getdividerheight() * (listadapter.getcount() - 1));     

        listview.setlayoutparams(params);     

    }     

}    

       隻要在設定listview的adapter後調用此靜态方法即可讓listview正确的顯示在其父listview的listitem中。但是要注意的是,子listview的每個item必須是linearlayout,不能是其他的,因為其他的layout(如relativelayout)沒有重寫onmeasure(),是以會在onmeasure()時抛出異常。

      在scrollview中嵌套listview(或者scrollview)的另外一個問題就是,子scrollview中無法滑動的(如果它沒有顯示完全的話),因為滑動事件會被父scrollview吃掉,如果想要讓子scrollview也可以滑動,隻能強行截取滑動事件,有牛人在論壇中發過代碼說可以。雖然我沒有親自試過,但估計是可行的。

      雖然在scrollview中顯示scrollview在技術上的難題可以攻破,但是這樣的設計卻是非常差的使用者體驗因為使用者會不容易看到和操作子scrollview中的内容。比如好的設計是,父listview的每個item隻顯示概括性的描述,然後點選其item會進入另外一個頁面來較長的描述和展示以及對這個item的操作。