2012-07-16 98 views
4

我已經創建了一個使用ViewPager滑過三個片段(三個片段中的每一個都包含一個GridView)的Android應用程序。瞭解片段活動生命週期

我最近開始瞭解片段,並假設在我的網格視圖在其片段中創建之後,每個片段都會在內存中,永遠不需要再次加載。

最近我注意到,當我從左邊的片段,中間的片段,然後到右邊的片段中滑動,最左邊的片段將不得不使用我的適配器再次填充它的gridview。

我只是想知道爲什麼會發生這種情況,當我從最左邊的片段導航到最右邊的片段,但不是當我在並排片段之間導航時。它只保留最近的片段在內存中,並殺死其他片段?還是有其他原因,爲什麼一個應用程序不會將所有三個片段保存在內存中?當我在片段之間快速導航時,我的應用會變得有點遲緩,速度很慢,所以如果可能的話,只需要繪製每個gridview一次就好了。

我填補我在的onCreate()的ArrayList(用於填充適配器),然後填寫我的GridView在onActivityCreated(捆綁savedInstanceState)適配器

回答

6

ViewPager在內存中保留了一定數量的離屏選項卡(當然是Fragment)。我相信所有設備的默認值爲1.因此,當您滾動到最右側時,只有左側的那個將保留在內存中。

如果您希望ViewPager保留內存中的所有選項卡(小心 - 在設備或其他正在運行的應用程序上可能會很難),您可以設置保留在內存中的屏幕外標籤數量。要執行此操作,請在ViewPager對象上使用setOffscreenPageLimit方法ViewPager

例子:

ViewPager pager = (ViewPager) findViewById(R.id.pager); // Your pager's ID 
pager.setOffscreenPageLimit(2); // Will retain 2 off-screen tabs + your selected tab 

希望這有助於!

+0

啊!忘了這個方法。最佳解決方案 – DeeV 2012-07-16 20:47:06

+0

完美。感謝您的幫助@Eric! – 2012-07-16 20:50:29

2

它是如何FragmentPagerAdapterFragmentPagerStateAdapter工作性質。從谷歌的網站:

The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible. 

含義,你GridView的補充,因爲你的ViewPager殺死了景觀,並設有重建。

編輯:如果您需要保留所有的三個片段Views在內存中,提高辦事效率,那麼你就必須創建自己的PagerAdapter存儲某種類型的Collection裏面instantiateItem(ViewGroup, int)的意見。

另外,如果您使用的是谷歌的例子一字不差,那麼你可能在做這樣的事情:

@Override 
public Fragment getItem(int position) { 
    return ArrayListFragment.newInstance(position); 
} 

在這種情況下,你的每一個請求ViewPager一次重建一個新片段。

+0

我們中的一些人僅僅是在片段集合中請求的位置返回一個片段返回this.fragments.get(position);它不會顯式創建新的片段,但如果您不更改setOffscreenPageLimit(),它將重新創建片段視圖。 – topwik 2012-08-16 16:44:40

1

缺省情況下,ViewPager保持閒置狀態,從當前頁面的左側和右側各有一個片段。您可以使用ViewPager.setOffscreenPageLimit()更改此行爲。請參閱docs