Android實戰技巧:如何在ScrollView中嵌套ListView

前幾天由於項目的須要,要在一個ListView中放入另外一個ListView,也即在一個ListView的每一個ListItem中放入另一個ListView。但剛開始的時候,會發現放入的小ListView會顯示不徹底,它的高度始終有問題。上網查了下,發現別人也有遇到這樣的問題,而大多數人都不推薦這樣的設計,由於默認狀況下Android是禁止在ScrollView中放入另外的ScrollView的,它的高度是沒法計算的。ide

     又搜索了一下,發現有StackOverflow上的牛人已經解決了這個問題,通過試驗發現是能夠解決問題的,它的思路就是在設置完ListView的Adapter後,根據ListView的子項目從新計算ListView的高度,而後把高度再做爲LayoutParams設置給ListView,這樣它的高度就正確了,如下是源碼:spa

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

  只要在設置ListView的Adapter後調用此靜態方法便可讓ListView正確的顯示在其父ListView的ListItem中。可是要注意的是,子ListView的每一個Item必須是LinearLayout,不能是其餘的,由於其餘的Layout(如RelativeLayout)沒有重寫onMeasure(),因此會在onMeasure()時拋出異常。源碼

      在ScrollView中嵌套ListView(或者ScrollView)的另一個問題就是,子ScrollView中沒法滑動的(若是它沒有顯示徹底的話),由於滑動事件會被父ScrollView吃掉,若是想要讓子ScrollView也能夠滑動,只能強行截取滑動事件,有牛人在論壇中發過代碼說能夠。雖然我沒有親自試過,但估計是可行的。it

      雖然在ScrollView中顯示ScrollView在技術上的難題能夠攻破,可是這樣的設計倒是很是差的用戶體驗由於用戶會不容易看到和操做子ScrollView中的內容。好比好的設計是,父ListView的每一個Item只顯示歸納性的描述,而後點擊其Item會進入另一個頁面來詳細描述和展現以及對這個Item的操做。io

      參考資料:http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing
class

相關文章
相關標籤/搜索