ViewPaper的FragmentPagerAdapter有缓存机制,懒加载机制,和预加载机制。
懒加载机制和预加载机制
一般情况下,它不会把所有的view一次加载,而是快当浏览到这个page时才去加载,一般是预加载下一个page,例如,有三个Tab,第一次进入页面时,会加载第一和第二个page,当滑到第二个page时,加载第三个page.这样做的目的可以减少内存占用,减少OutOfMemory异常的几率,也使滑动更加流畅。
缓存机制
页面的总数是已知的,或者可以计算出来,每个页面占用的资源并不多并且需要经常使用这些页面。这时可以考虑将其常驻ViewPager而不去销毁(频繁的销毁和重建也会消耗比较多的资源)。默认情况下,切换页面时会缓存上一个页面,非相邻页面被销毁,我们也可以通过viewPaper.setOffscreenPageLimit(2)方法来设置缓存的数目;
简单描述一下ViewPaper加载和销毁的过程:
FragmentPagerAdapter中的重要方法:
@Override
public Fragment getItem(int arg0) {
Utils.log("position::"+arg0);
return StoreViewPaperFragment.newInstance(arg0);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
Utils.log("destroyItem1+++++"+position);
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
Utils.log("instantiateItem2+++++"+position);
return super.instantiateItem(container, position);
}
Fragment中的中的重要方法:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
switch (position) {
case 0:
if (StoreActivity.pageViews.size() > 0) {
view = StoreActivity.pageViews.get(0);
// Utils.log("pageView size::"+StoreActivity.pageViews.size()+",position="+position);
} else {
view = (StorePageItemView)inflater.inflate(R.layout.store, null);
view.setPluginType(Constants.PLUGIN_WIDGET_THEME);
StoreActivity.pageViews.add(0,view);
StoreViewPaperAdapter.initViewPaperInterface.onFinish();
// Utils.log("0");
}
break;
case 1:
if (StoreActivity.pageViews.size() > 1) {
view = StoreActivity.pageViews.get(1);
// Utils.log("pageView size::"+StoreActivity.pageViews.size()+",position="+position);
} else {
view = (StorePageItemView)inflater.inflate(R.layout.store, null);
view.setPluginType(Constants.PLUGIN_ICON_SETS);
StoreActivity.pageViews.add(1,view);
// Utils.log("1");
}
break;
case 2:
if (StoreActivity.pageViews.size() > 2) {
view = StoreActivity.pageViews.get(2);
// Utils.log("pageView size::"+StoreActivity.pageViews.size()+",position="+position+",store size="+view.getStoreList().size());
} else {
view = (StorePageItemView)inflater.inflate(R.layout.store, null);
view.setPluginType(Constants.PLUGIN_APP_SKIN_THEME);
StoreActivity.pageViews.add(2,view);
}
break;
ViewGroup parent = ((ViewGroup) view.getParent());
if (parent != null) {
parent.removeView(view);
}
public static Fragment newInstance(int position){
StoreViewPaperFragment fragment = new StoreViewPaperFragment();
Bundle args = new Bundle();
args.putInt(TAB_FLAG, position);
fragment.setArguments(args);
return fragment;
}
我们以三个pager为例来描述一下整个过程。第一次进入页面时,首先执行instantiateItem方法初始化Item1,其次是getItem方法加载paper1,然后初始化Item2,加载paper2,然后执行两次Fragment中的onCreateView方法完成page的加载,当我们滑动到page2时,
同样的流程去加载page3。当我们滑动到page3时,会调用destroyItem方法销毁page1.