網頁

2014年9月12日 星期五

Android 在 ScrollView 裡使用 ListView

這篇純粹拾人牙慧,來源是 How can I put a ListView into a ScrollView without it collapsing?

如同大家知道的的,ListView 放入 ScrollView 之後就變成疊起來的狀態
實際上 ListView 本身就能夠 scroll,只要將 layout_height 設定成 wrap_content 就可以了
把兩個具有 scroll 能力的元件疊加使用反而會沒辦法正常顯示

但有時候你想做的會是將複數個 ListView 並排展開
外面再包一層 ScrollView 讓一次就能捲動所有的 ListView
這時候就需要一些特殊技巧處理

提醒如果你要製作的排版並不複雜
也許只需要透過 ListView 的 addHeaderView、addFooterView 就能滿足需求
如果你要捲動的範圍內包含了文字、圖片、很多個ListView等複雜的排版,才建議使用這個方式

public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        // pre-condition
        return;
    }

    int totalHeight = listView.getPaddingTop() + listView.getPaddingBottom();
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        if (listItem instanceof ViewGroup) {
            listItem.setLayoutParams(new AbsListView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.WRAP_CONTENT));
        }
        listItem.measure(0, 0);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
}

這個static method可以重新計算ListView應有的高度

因為 ScrollView 內只能有一個子元件
透過 Layout 元件包覆了你想捲動的所有元件後,再包上一層 ScrollView
之後設定完所有的 ListView 的 adapter 後,再透過此 method 一一重新設定 ListView 的高度
這樣就能在ScrollView中捲動具有原本正常高度的 ListView 囉

2 則留言:

  1. 卡在這個地方了很久了..終於..太感動了!! 謝謝你!!

    回覆刪除