1. 程式人生 > >ViewPager+Fragment+ListView重新載入後資料來源重複問題的解決方法

ViewPager+Fragment+ListView重新載入後資料來源重複問題的解決方法

今天在專案中遇到了一個問題,我的主頁Activity是以ViewPager+Fragment進行構建的,其中有兩個Fragment又包含了ListView,正常情況下這兩個Fragment的介面如下:
這裡寫圖片描述這裡寫圖片描述
但是當我從主頁Activity跳轉到另一個Activity,之後再返回主頁Activity時,發現第一個包含ListView的Fragment的介面變成了下面這樣:
這裡寫圖片描述
很明顯這是ListView的資料來源重複新增造成的錯誤,但是奇怪的是另一個包含ListView的Fragment卻非常正常,沒有發生資料來源重複的錯誤:
這裡寫圖片描述
起初我以為是第一個Fragment的程式碼邏輯出了問題,但是經過一步步的排查後發現並沒有什麼問題,這時我懷疑是ViewPager的內部機制造成的,如果ViewPager的機制是當我從另一個Activity返回時,ViewPager只重新執行第一頁Fragment的onCreateView方法的話,這種Bug就解釋的通了。但在這個猜想前我得先排除自己的程式碼邏輯有問題這一干擾因素,於是我將正常Fragment的程式碼全部複製到第一個Fragment,經過bug復現我發現同樣的程式碼,但是第一個Fragment依然出現了資料來源重複的問題:
這裡寫圖片描述


到這裡我就可以確定是ViewPager的機制導致了這一問題,這時我想到了ViewPager的方法中有一個方法叫setOffscreenPageLimit(int limit),之前我對這個方法的理解一直是預載入,但在查詢了官方Api的解釋之後,原來這個方法的實質是在空閒狀態下,將檢視層次結構中當前頁面的兩側應保留的頁面數設定為空,超出此限制的頁面將在需要時從介面卡重新建立。總結起來就是這個方法可以快取頁面,也就是說我只要將所有頁面快取進去就行了,於是我傳入引數5之後,再進行Bug復現,這時果然就不再出現資料來源重複的問題了。