一、什么是ViewPager
ViewPager是一个允许使用者左右滑动数据页面的布局管理器,通过一个适配器(PagerAdapter)来管理要显示的页面。 ViewPager更多的时候会与Fragment一起使用,这是一种很好的方法来管理各个页面的生命周期。Android提供了一些专门的适配器来让ViewPager与Fragment一起工作,也就是FragmentPagerAdapter与FragmentStatePagerAdapter。
二、ViewPager的适配器
PagerAdapter是用于“将多个页面填充到ViewPager”的适配器的一个基类,自定义Adapter时需要继承它。
PagerAdapter有两个之类FragmentPagerAdapter,FragmentStatePagerAdapter;
-
setOffScreenPageLimit(int limit)设置viewpager左右预加载页
-
FragmentPagerAdapter将每一个生成的Fragment保存在内存中,limit外Fragment没有销毁,生命周期为onPause->onStop->onDestroyView,onCreateView->onStart->onResume,但Fragment的成员变量都没有变,所以可以缓存根View,避免重复inflate
适用特点:FragmentPagerAdapter最适用于那种少量且相对静态的页面 -
FragmentStatePagerAdapter对limit外的Fragment销毁,生命周期为onPause->onStop->onDestoryView->onDestory->onDetach, onAttach->onCreate->onCreateView->onStart->onResume
适用特点:FragmentStatePagerAdapter更多用于大量页面
三、FragmentPagerAdapter与FragmentStatePagerAdapter特点
- 是否需要在适配器的public Fragment getItem(int position)方法中返回缓存List<Fragment>中的Fragment
- 分析:对于FragmentPagerAdapter,instantiateItem()先从FragmentManager.findFragmentByTag()中查找FragmentManager中List缓存的Fragment,取不到则会调用getItem(),所以对于缓存在内存中的FragmentPagerAdapter没有必要再使用一个List缓存Fragment,因为FragmentPagerAdapter会缓存每一个加载过的Fragment到内存中
@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;
}
网友评论