ViewPaper+Fragment

郭琦
2023-12-01
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.
 类似资料: