[英]Understanding fragment activity lifecycle
我創建了一個Android應用程序,它使用ViewPager來瀏覽三個片段(三個片段中的每一個都包含一個gridview)。
我最近開始學習片段,並假設在我的網格視圖在其片段中創建后,每個片段都將在內存中,而不必再次加載。
最近我注意到,當我從左側片段滑動到中間片段,然后到右側片段時,最左邊的片段必須再次使用我的適配器填充其gridview。
我只是想知道為什么當我從最左邊的片段導航到最右邊的片段時會發生這種情況,而不是當我在並排片段之間導航時。 它是否只將最新的片段保留在內存中並殺死其他片段? 或者是否有其他原因導致應用程序無法將所有三個片段保留在內存中? 當我在片段之間快速導航時,我的應用程序會有點滯后和緩慢,所以如果可能的話,只需要一次繪制每個gridview就好了。
我在onCreate()中填充我的arraylist(用於填充適配器),然后用onActivityCreated中的適配器填充我的gridview(Bundle savedInstanceState)
ViewPager
在ViewPager
保留了一定數量的屏幕外標簽(當然是Fragment
)。 我相信所有設備的默認值為1.因此,當您滾動到最右側時,只有左側的那個將保留在內存中。
如果您希望ViewPager
保留內存中的所有選項卡(小心 - 這可能在設備或其他正在運行的應用程序上很難),您可以設置要在內存中保留多少屏幕外選項卡。 為此, ViewPager
在ViewPager
對象上使用setOffscreenPageLimit
方法。
例:
ViewPager pager = (ViewPager) findViewById(R.id.pager); // Your pager's ID
pager.setOffscreenPageLimit(2); // Will retain 2 off-screen tabs + your selected tab
希望這可以幫助!
這是FragmentPagerAdapter
和FragmentPagerStateAdapter
如何工作的本質。 來自Google的網站:
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)
。
或者,如果您逐字使用Google的示例,那么您可能正在執行以下操作:
@Override
public Fragment getItem(int position) {
return ArrayListFragment.newInstance(position);
}
在這種情況下,每次ViewPager請求時,您都在重建一個新片段。
默認情況下, ViewPager
從左側一個片段和當前頁面右側一個片段保持空閑狀態。 您可以使用ViewPager.setOffscreenPageLimit()
更改此行為。 查看文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.