天天看點

ScrollView嵌套ViewPager自适應高度

由于項目需要,ScrollView 嵌套ViewPager加載Fragment再包裹RecyclerView等控件來實作一系列功能。在此主要是關于加載資料,ViewPager動态設定高度的問題以及加載資料,滑動不卡頓。做總結。

問題:ViewPager在ScrollView的包裹下,無論高度是設定match_parent,或是wrap_content,都無法加載出fragment中的資料,必須設定确定直才能顯示,(500dp),給定确定值以後,資料上拉加載無法實作。是以我們必須要動态計算fragment中RecyclerView的高度,動态的賦高度給ViewPager.

先上圖,由于上傳不了短視訊,沒有制作gif,就看圖檔吧,文章下面,有下載下傳的連結

ScrollView嵌套ViewPager自适應高度

挖坑:動态設定ViewPager高度,最初的實作思路,計算ViewPager目前選中的View(Fragment)的高度。

ViewPager滑動監聽的方法中,onPageSelected(intposition),可以獲得目前的選中的View的下标位置。

我在重寫ViewPager的類中,使用滑動監聽傳入的下标位置來取得目前的View,的高度。

@Override
public void onPageSelected(int position) {
    viewPager.resetHeight(position);
}      
實踐證明,現實和想法還是有差距的,運作切換,指向view為null,列印多遍log,以及查閱資料,才知道      
viewPager隻會維持2-3個view,滑動時加載和删除view,然而傳入的current,可以是無限的,,,      
解決方法:      
ScrollView嵌套ViewPager自适應高度
周遊ViewPager所有的子View,得到高度,指派給ViewPager。這樣寫,是解決了view為null的問題,并且也給ViewPager設定了高度,      
但是,切換頁面時,子View的高度與最大的子View的高度不比對,就會導緻,頁面下一大片空白部分。      
解決方法:計算目前view的高度,并指派給viewPager。ViewPager下的Fragment中,包含RecyclerView,的高度,      
于是,我在RecyclerView的擴充卡中,累加計算item的高度,得到總和後,指派給ViewPager,解決了頁面空白的部分,      
但是,滑動加載到很多頁以後,明顯感覺螢幕卡頓嚴重的問題。是以,還是需要思考優化。。。。。      
參考了鴻洋的部落格,使用HashMap,根據下标位置,來儲存每一個View。具體如下:      
ScrollView嵌套ViewPager自适應高度
ok,到這裡為止,核心的代碼基本是可以解決了,可以正常取到目前的View,并且獲得高度。      
但是還是有一些,微微的卡頓的問題,思考完善之後,在代碼中模拟了網絡加載資料的情況,進行分析,      
以下幾點比較容易遺忘和需要優化的地方。      
ScrollView嵌套ViewPager自适應高度
ScrollView嵌套ViewPager自适應高度
上面代碼有沒毛病?正常來講,這樣寫,還是會實作資料加載,高度計算等。但是你會發現越來越卡,卡到你懷疑人生。      
于是,,,我思考了這幾行代碼的順序,,,目前的Fragment的顯示的時候,setUserVisibleHint() 方法調用,通路網絡資料,      
viewPager監聽到onPageSelected(),方法,計算目前頁面的高度,此時可能出現網絡卡頓,又或者,你得到了傳回的網絡資料,      
并且關閉了,refresh的重新整理方法,但是adapter可能還沒加載完資料,是以導緻加載卡頓,滑動不流暢等問題。解決如下:      
在Fragment中,沒有使用,setUserVisibleHint()方法,來執行getData(),在監聽的onPageSelected()方法中,執行getData(),      
保證擷取資料,在前,計算高度在後,回到Fragment中,在Handler中,資料加載,填充,重新整理,在前,關閉progressDialog,refresh      
在後,確定重新整理完資料(與計算高度相關),再關閉。能夠很好的提升頁面的流程度。      
源碼下載下傳