簡體   English   中英

了解片段活動生命周期

[英]Understanding fragment activity lifecycle

我創建了一個Android應用程序,它使用ViewPager來瀏覽三個片段(三個片段中的每一個都包含一個gridview)。

我最近開始學習片段,並假設在我的網格視圖在其片段中創建后,每個片段都將在內存中,而不必再次加載。

最近我注意到,當我從左側片段滑動到中間片段,然后到右側片段時,最左邊的片段必須再次使用我的適配器填充其gridview。

我只是想知道為什么當我從最左邊的片段導航到最右邊的片段時會發生這種情況,而不是當我在並排片段之間導航時。 它是否只將最新的片段保留在內存中並殺死其他片段? 或者是否有其他原因導致應用程序無法將所有三個片段保留在內存中? 當我在片段之間快速導航時,我的應用程序會有點滯后和緩慢,所以如果可能的話,只需要一次繪制每個gridview就好了。

我在onCreate()中填充我的arraylist(用於填充適配器),然后用onActivityCreated中的適配器填充我的gridview(Bundle savedInstanceState)

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

如果您希望ViewPager保留內存中的所有選項卡(小心 - 這可能在設備或其他正在運行的應用程序上很難),您可以設置要在內存中保留多少屏幕外選項卡。 為此, ViewPagerViewPager對象上使用setOffscreenPageLimit方法。

例:

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

希望這可以幫助!

這是FragmentPagerAdapterFragmentPagerStateAdapter如何工作的本質。 來自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM