0

我已經實現了在viewpager中顯示片段的活動。該活動最初顯示給定類型的5個片段(類型A)。每種類型的A片段都包含一個信息列表。當按下按鈕時,片段被另一片片段替換,即類型B(即,使用不同佈局並顯示不同信息的片段被加載)。FragmentStatePagerAdapter性能問題

我用ViewPager和一個自定義的FragmentStatePagerAdapter實現了這個。自定義FragmentStatePagerAdapter覆蓋了getCount,instantiateItem,getItem,getItemPosition等函數,並且所有工作都正常。當我按下按鈕的視圖切換從片段類型A到片段類型B.爲了做到這一點,我正在使用替換片段事務,我也調用適配器上的notifyDataSetChanged。從類型A切換到類型B碎片是通過檢查我需要在適配器的getItem函數中創建哪種類型的碎片來完成的。問題在於切換過程(即從片段類型A改變爲片段類型B,反之亦然)需要一些時間(大約2秒) - 這種延遲是相當明顯且令人討厭的。

這是因爲適配器的getItemPosition函數返回POSITION_NONE。當POSITION_NONE返回時,viewPager重新創建片段。此外,執行替換事務時,將刪除適配器的所有項目,並重新創建所有新項目。當我切換回類型A的片段時也會發生同樣的情況。

有誰知道是否有更好或更快的方法來做到這一點?使用FragmentPagerAdapter不應該是一個好的解決方案,因爲viewPager中的片段數量可能會增加。

我已經評論了碎片的更新並且問題消失了,所以問題是更新碎片所花費的時間。有沒有辦法異步更新片段?這應該照顧到這個問題。

+0

據我所知,你有兩個層次的'片段'。爲什麼你沒有爲B型的'Fragments'實例化第二個'ViewPager'?比你在每個級別有一個自己的'ViewPager'和'FragmentStatePageAdapter',你不必關心哪個'Fragment'必須被實例化。 – owe

+0

類型A的片段顯示值的列表。類型B的片段顯示對應於每組值的圖形。例如,我有位置1的銷售,位置2的銷售等,直到位置5.當我單擊按鈕時,銷售數據被位置1,2,3的銷售圖取代。5.如果我我正在查看位置4的銷售情況並點擊按鈕,我會轉到位置4的銷售圖表。向左或向右滑動會使我看到圖表5或3.現在它的工作方式是,速度問題。我錯過了什麼嗎?如果我需要在某個位置顯示50個位置,該怎麼辦? – user501223

+0

我不認爲你必須擔心你想顯示的位置的數量。 「FragmentStatePagerAdapter」的Api表示:「當有大量頁面時,這個版本的頁面更有用,工作更像列表視圖,當頁面對用戶不可見時,它們的整個片段可能被破壞,只有保持該片段的保存狀態,這使得尋呼機能夠保持與每個訪問頁面相關的內存少得多,與FragmentPagerAdapter相比,在頁面之間切換時可能會產生更多開銷。「 – owe

回答

0

ViewPager默認情況下默認最小計數爲Fragments。一般來說,左側和右側的當前Fragment。所以你不需要關心Fragments的總數。

您可以使用ViewPager.setOffScreenPageLimit()方法控制總數。

另外一個AsyncTask似乎是一個好主意來管理你Fragments的緊張工作。