一、什么是ViewPager
ViewPager是一個(gè)允許使用者左右滑動(dòng)數(shù)據(jù)頁(yè)面的布局管理器,通過(guò)一個(gè)適配器(PagerAdapter)來(lái)管理要顯示的頁(yè)面。 ViewPager更多的時(shí)候會(huì)與Fragment一起使用,這是一種很好的方法來(lái)管理各個(gè)頁(yè)面的生命周期。Android提供了一些專門(mén)的適配器來(lái)讓ViewPager與Fragment一起工作,也就是FragmentPagerAdapter與FragmentStatePagerAdapter。
二、ViewPager的適配器
PagerAdapter是用于“將多個(gè)頁(yè)面填充到ViewPager”的適配器的一個(gè)基類,自定義Adapter時(shí)需要繼承它。
PagerAdapter有兩個(gè)之類FragmentPagerAdapter,F(xiàn)ragmentStatePagerAdapter;
setOffScreenPageLimit(int limit)設(shè)置viewpager左右預(yù)加載頁(yè)
FragmentPagerAdapter將每一個(gè)生成的Fragment保存在內(nèi)存中,limit外Fragment沒(méi)有銷毀,生命周期為onPause->onStop->onDestroyView,onCreateView->onStart->onResume,但Fragment的成員變量都沒(méi)有變,所以可以緩存根View,避免重復(fù)inflate
適用特點(diǎn):FragmentPagerAdapter最適用于那種少量且相對(duì)靜態(tài)的頁(yè)面FragmentStatePagerAdapter對(duì)limit外的Fragment銷毀,生命周期為onPause->onStop->onDestoryView->onDestory->onDetach, onAttach->onCreate->onCreateView->onStart->onResume
適用特點(diǎn):FragmentStatePagerAdapter更多用于大量頁(yè)面
三、FragmentPagerAdapter與FragmentStatePagerAdapter特點(diǎn)
- 是否需要在適配器的public Fragment getItem(int position)方法中返回緩存List<Fragment>中的Fragment
- 分析:對(duì)于FragmentPagerAdapter,instantiateItem()先從FragmentManager.findFragmentByTag()中查找FragmentManager中List緩存的Fragment,取不到則會(huì)調(diào)用getItem(),所以對(duì)于緩存在內(nèi)存中的FragmentPagerAdapter沒(méi)有必要再使用一個(gè)List緩存Fragment,因?yàn)镕ragmentPagerAdapter會(huì)緩存每一個(gè)加載過(guò)的Fragment到內(nèi)存中
@NonNull
public Object instantiateItem(@NonNull ViewGroup container, int position) {
if (this.mCurTransaction == null) {
this.mCurTransaction = this.mFragmentManager.beginTransaction();
}
long itemId = this.getItemId(position);
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = this.mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
this.mCurTransaction.attach(fragment);
} else {
fragment = this.getItem(position);
this.mCurTransaction.add(container.getId(), fragment, makeFragmentName(container.getId(), itemId));
}
if (fragment != this.mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
@NonNull
public Object instantiateItem(@NonNull ViewGroup container, int position) {
Fragment fragment;
if (this.mFragments.size() > position) {
fragment = (Fragment)this.mFragments.get(position);
if (fragment != null) {
return fragment;
}
}
if (this.mCurTransaction == null) {
this.mCurTransaction = this.mFragmentManager.beginTransaction();
}
fragment = this.getItem(position);
if (this.mSavedState.size() > position) {
SavedState fss = (SavedState)this.mSavedState.get(position);
if (fss != null) {
fragment.setInitialSavedState(fss);
}
}
while(this.mFragments.size() <= position) {
this.mFragments.add((Object)null);
}
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
this.mFragments.set(position, fragment);
this.mCurTransaction.add(container.getId(), fragment);
return fragment;
}