《Android APP要解決的問題》之顯示篇:ScrollView嵌套ListView

前言

有些需求中界面里面除了listview還有其他內容需要顯示,而且內容還不少,這樣的話交給listview的空間就少了很多,這樣就得嵌套一層scrollview來讓整個界面都可以滑動,才能完整的看到listview,不至于就那么一小塊地方在那里上下滑動。

然后在scroll里面嵌套listview問題就出來了,listview只顯示了一行或者兩行數據,這就蛋疼了,當然可以手動給listview設置一個高度,但是這顯然不能適配所有手機屏幕的顯示。這里記錄一下解決方式。

解決一

我之前采取的方式是重新手動計算ListView高度,代碼如下:

public class UIUtil {
    public static void setListViewHeightBasedOnChildren(ListView listView) {
        //獲取ListView對應的Adapter
        ListAdapter listAdapter = listView.getAdapter();
        if (listAdapter == null) {
            // pre-condition
            return;
        }

        int totalHeight = 0;
        for (int i = 0, len = listAdapter.getCount(); i < len; i++) {   //listAdapter.getCount()返回數據項的數目
            View listItem = listAdapter.getView(i, null, listView);
            listItem.measure(0, 0);  //計算子項View 的寬高
            totalHeight += listItem.getMeasuredHeight();  //統計所有子項的總高度
        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();
        params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
        //listView.getDividerHeight()獲取子項間分隔符占用的高度
        //params.height最后得到整個ListView完整顯示需要的高度
        listView.setLayoutParams(params);
    }
}


然后在用到listview的地方再調用就行了。

問題

然鵝昨天發現會在oppo,系統版本4.2.2上面會報空指針,我6.0系統沒問題。具體原因沒有沒有探究,因為我要先解決問題,報錯代碼來自于這一行:

listItem.measure(0, 0);

解決二

然后我就換了另外一種方式,自定義listview,重寫onMeasure方法:

 @Override
    /**
     * 重寫該方法,達到使ListView適應ScrollView的效果
     */
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
                MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, expandSpec);
    }

這里主要是對高度進行了重繪,MeasureSpec.AT_MOST測量模式:The child can be as large as it wants up to the specified size.需要展示的子view會盡量大到它具體的大小。強行設置AT_MOST來測量ListView自適應。

別忘記重新換控件引用。

然后就是進入界面的時候,會直接定位到listview的頂部,解決:

scrollview.smoothScrollTo(0, 0);

問題

嚴重的性能問題,根據官方設計建議,ListView其實是禁止放在ScrollView等垂直滾動視圖中的,具體說明參看Android應用性能優化系列視圖篇——ListView自適應導致的嚴重性能問題,強行放置的結果就是ScrollView中嵌有列表的頁面可能會卡出翔,文章中也給出了幾點建議。但是我使用的場景是不會用大量數據的,性能再耗也不會卡/姚明笑~

解決三

但是數據量大的怎么辦呢?上面引文中提到了一個自定義控件,SimulateListView或許可以滿足需求,但是我木有嘗試,這里做一個記錄而已,以備不時之需。

這次沒有代碼


本文作者:paradoxie
個人主頁:謝盒盒的小黑屋,不止說技術
簡書地址:簡書主頁,專注技術類
github地址:paradoxie
轉載請注明出處,蟹蟹!
-------我的夢想真的是做一條咸魚!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容