美文网首页
第十四章 ViewPager

第十四章 ViewPager

作者: 唔笛plk | 来源:发表于2019-01-02 14:33 被阅读0次

    一、什么是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;
        }
    

    四、ViewPager中Fragment的懒加载

    https://www.jianshu.com/p/bdbddc8fbbaa

    相关文章

      网友评论

          本文标题:第十四章 ViewPager

          本文链接:https://www.haomeiwen.com/subject/yykplqtx.html