您好,登錄后才能下訂單哦!
本篇內容介紹了“FragmentPagerAdapter和FragmentStatePagerAdapter有什么區別”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
public class FragmentPagerAdapter{ // ...... public static final int POSITION_UNCHANGED = -1; public static final int POSITION_NONE = -2; public Parcelable saveState() { return null; } public void restoreState(Parcelable state, ClassLoader loader) { } }
而FragmentPagerStateAdapter則實現了saveState()、restoreState()這倆方法:
public Parcelable saveState() { Bundle state = null; if (mSavedState.size() > 0) { state = new Bundle(); Fragment.SavedState[] fss = new Fragment.SavedState[mSavedState.size()]; mSavedState.toArray(fss); state.putParcelableArray("states", fss); } for (int i=0; i<mFragments.size(); i++) { Fragment f = mFragments.get(i); if (f != null && f.isAdded()) { if (state == null) { state = new Bundle(); } String key = "f" + i; mFragmentManager.putFragment(state, key, f); } } return state; } @Override public void restoreState(Parcelable state, ClassLoader loader) { if (state != null) { Bundle bundle = (Bundle)state; bundle.setClassLoader(loader); Parcelable[] fss = bundle.getParcelableArray("states"); mSavedState.clear(); mFragments.clear(); if (fss != null) { for (int i=0; i<fss.length; i++) { mSavedState.add((Fragment.SavedState)fss[i]); } } Iterable<String> keys = bundle.keySet(); for (String key: keys) { if (key.startsWith("f")) { int index = Integer.parseInt(key.substring(1)); Fragment f = mFragmentManager.getFragment(bundle, key); if (f != null) { while (mFragments.size() <= index) { mFragments.add(null); } f.setMenuVisibility(false); mFragments.set(index, f); } else { Log.w(TAG, "Bad fragment at key " + key); } } } } }
FragmentStatePagerAdapter對Fragment的狀態進行了保存
FragmentStatePagerAdapter是整個Fragment對象的移除和重建
public Object instantiateItem(ViewGroup container, int position) { if (mFragments.size() > position) { Fragment f = mFragments.get(position); if (f != null) { return f; } } if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } // 實例化fragment(交給我們實現的getItem方法) Fragment fragment = getItem(position); if (mSavedState.size() > position) { Fragment.SavedState fss = mSavedState.get(position); if (fss != null) { fragment.setInitialSavedState(fss); } } // 如果緩存 <= ViewPager傳入的position,說明當前位置還未存入緩存. while (mFragments.size() <= position) { // 先占個坑 mFragments.add(null); } fragment.setUserVisibleHint(false); // 填坑 mFragments.set(position, fragment); // 填充視圖 mCurTransaction.add(container.getId(), fragment); return fragment; } @Override public void destroyItem(ViewGroup container, int position, Object object) { Fragment fragment = (Fragment) object; if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } // 從緩存中移除 mFragments.set(position, null); // 從FragmentManager中移除 mCurTransaction.remove(fragment); }
FragmentPagerAdapter是視圖的attach和detach,不會對整個fragment進行完全的添加和刪除操作。
因此,可見二者在使用場景上不同,如果頁面較少,仍舊希望能夠將生成的Fragment保存在內存中,在需要顯示的時候直接調用。而不要產生生成、銷毀對象的額外開銷。這樣效率最高。這種情況下,選中FragmentPagerAdapter更合適。
對于在使用FragmentPagerAdapter出現白屏或者刷新不了的bug,除了替換成FragmentStatePagerAdapter,還需要重載getItem()和instantiateItem()對象。
對于getItemPosition()方法,兩個累的區別是:FragmentStatePagerAdapter會在因POSITION_NONE觸發調用的destroyItem中真正的釋放資源,重新建立一個新的Fragment;而FragmentPagerAdapter僅僅會在destoryItem()中detach這個Fragment,在instantiateItem()時會使用舊的Fragment,并觸發attach,并沒有觸發資源及重建的過程。
“FragmentPagerAdapter和FragmentStatePagerAdapter有什么區別”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。