1. ViewPager的簡單適配器PageAdapter
參看文章第一二小節(jié)
實(shí)現(xiàn)PageAdaper必須實(shí)現(xiàn)它的4個(gè)方法
getCount()
返回頁面頁面數(shù)量
Object instantiateItem(ViewGroup container, int position)
將頁面的view加入container中, 并返回對(duì)應(yīng)的的key
boolean isViewFromObject(View view, Object object)
判斷頁面的view和key是否匹配
void destroyItem(ViewGroup container, int position, Object object)
將第position頁的view從container中移除
2.使用FragmentPageAdapter
實(shí)現(xiàn)兩個(gè)方法 (FragmentPageAdapter實(shí)現(xiàn)了instantiateItem,isViewFromObject,destroyItem)
public int getCount()
返回頁面頁面數(shù)量
Fragment getItem(int position)
返回第position頁的Fragment
注意 如下FragmentPagerAdapter的源碼
- instantitatItem首先從FragmentManager中獲取Fragment
如果沒有吴侦,則再從getItem中獲取
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
2 . destroyItem
從FragmentMananger detach掉Fragment,此時(shí)Fragment仍然在FragmentManager中
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
+ " v=" + ((Fragment)object).getView());
mCurTransaction.detach((Fragment)object);
}
3. FragmentPagerStateAdapter
仍然只需要實(shí)現(xiàn) getCount() 和instantiateItem()方法
FragmentPagerStateAdapter相關(guān)源碼
- instantitatItem 邏輯和FramentPagerAapter類似
首先從FragmentManager中獲取Fragment
如果沒有屋休,則再從getItem中獲取
public Object instantiateItem(ViewGroup container, int position) {
// If we already have this item instantiated, there is nothing
// to do. This can happen when we are restoring the entire pager
// from its saved state, where the fragment manager has already
// taken care of restoring the fragments we previously had instantiated.
if (mFragments.size() > position) {
Fragment f = mFragments.get(position);
if (f != null) {
return f;
}
}
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
Fragment fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
if (mSavedState.size() > position) {
Fragment.SavedState fss = mSavedState.get(position);
if (fss != null) {
fragment.setInitialSavedState(fss);
}
}
while (mFragments.size() <= position) {
mFragments.add(null);
}
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
mFragments.set(position, fragment);
mCurTransaction.add(container.getId(), fragment);
return fragment;
}
2 . destroyItem
從FragmentMananger remove掉Fragment,此時(shí)Fragment不在FragmentManager中
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment) object;
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
+ " v=" + ((Fragment)object).getView());
while (mSavedState.size() <= position) {
mSavedState.add(null);
}
mSavedState.set(position, fragment.isAdded()
? mFragmentManager.saveFragmentInstanceState(fragment) : null);
mFragments.set(position, null);
mCurTransaction.remove(fragment);
}
-
FragmentPagerAdapter與FragmentPagerStateAdapter的區(qū)別
image
實(shí)例
- viewpager.setOffscrennPageLimit(1);
- 從第一頁滑動(dòng)第二頁,會(huì)創(chuàng)建第三頁
- 從第二頁滑到第一頁备韧,會(huì)調(diào)用destroyItem摧毀第三頁
- 區(qū)別在于FragmentPagerAdapter與FragmentPagerStateAdapter的destoryItem方法實(shí)現(xiàn)不一樣劫樟。FragmentPagerAdapter會(huì)將Fragment從FragmentManger總detach()
FragmentPagerStateAdapter會(huì)將Fragment從FragmentManger總remove()