如果应用场景是更多的Fragment,请使用FragmentStatePagerAdapter。 FragmentStatePagerAdapter FragmentStatePagerAdapter和FragmentPagerAdapter 类似。 继承 PagerAdapter。
如文档所述,该类内的每一个生成的 Fragment 都将保存在内存之中,因此适用于那些相对静态的页,数量也比较少的那种;如果需要处理有很多页,并且数据动态性较大、占用内存较多的情况,应该使用FragmentStatePagerAdapter 2.FragmentStatePagerAdapter FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter 由于 FragmentStatePagerAdapter.instantiateItem() 在大多数情况下,都将调用 getItem() 来生成新的对象,因此如果在该函数中放置与数据集相关的 setter FragmentStatePagerAdapter 就是通过这种方式,每次都创建一个新的 Fragment,而在不用后就立刻释放其资源,来达到节省内存占用的目的的。
用相应的适配器Adapter关联上面的页卡(View/Fragment)和ViewPager: PagerAdapter 数据源:List FragmentPagerAdapter 数据源:List FragmentStatePagerAdapter FragmentStatePagerAdapter 和 FragmentPagerAdapter 的异同: 同 PageAdapter 是 FragmentPagerAdapter 以及 FragmentStatePagerAdapter 的基类,可将上面的FragmentPagerAdapter 替换成FragmentStatePagerAdapter 异 FragmentPagerAdapter使用时,每一个生成的 Fragment 都将保存在内存之中,而 FragmentStatePagerAdapter 只保留了当前显示的Fragment,其他划过的Fragment离开视线后,就会被销毁;而在页面需要显示时,再生成新的实例。 即当拥有大量的页面时,使用FragmentStatePagerAdapter不必在内存中占用大量的内存 6.
fragmentContainter.get(arg0); } }); 这样就可以实现滑动Fragment 重要的话 PageAdapter 是 FragmentPagerAdapter 以及 FragmentStatePagerAdapter 的基类,可以将上面的替换成FragmentStatePagerAdapter 。 FragmentStatePagerAdapter 和 FragmentPagerAdapter 的区别: FragmentPagerAdapter使用时,每一个生成的 Fragment 都将保存在内存之中 ,而 FragmentStatePagerAdapter 只保留了当前显示的Fragment,其他划过的Fragment离开视线后,就会被销毁;而在页面需要显示时,再生成新的实例(可以通过打印Fragment
引言 在使用 ViewPager 时 , 如果我们的适配器使用的是 FragmentStatePagerAdapter ,那么当我们重新滑到之前已销毁的页面时,一般情况下页面的状态依然将保持不变(比如 基础概念 ViewPager 官方的适配器有两种,即 FragmentPagerAdapter 以及 FragmentStatePagerAdapter 。 主要原因是 FragmentStatePagerAdapter 每次会重建以及 销毁 Fragment, 而 FragmentPageAdapter 并不会销毁实例,只是对视图做了 attach 和 detach MainAdapter]: class MainAdapter(fragmentManager: FragmentManager, private val datas: List<String>) : FragmentStatePagerAdapter return fragment; } 小结 所以我们可以简单理解为 FragmentStatePagerAdapter 之所以可以做到状态还原,是因为其在销毁 Fragment 时,默认缓存了当前 Fragment
用相应的适配器Adapter关联上面的页卡(View/Fragment)和ViewPager: PagerAdapter 数据源:List FragmentPagerAdapter 数据源:List FragmentStatePagerAdapter 和 FragmentPagerAdapter 的异同: 同 PageAdapter 是 FragmentPagerAdapter 以及 FragmentStatePagerAdapter 的基类 ,可将上面的FragmentPagerAdapter 替换成FragmentStatePagerAdapter 异 FragmentPagerAdapter使用时,每一个生成的 Fragment 都将保存在内存之中,而 FragmentStatePagerAdapter 只保留了当前显示的Fragment,其他划过的Fragment离开视线后,就会被销毁;而在页面需要显示时,再生成新的实例。 即当拥有大量的页面时,使用FragmentStatePagerAdapter不必在内存中占用大量的内存 总结 本文对ViewPage进行了全面的介绍,接下来我会介绍继续介绍Android开发中的相关知识
FragmentPagerAdapter和FragmentStatePagerAdapter这两个类都有简单的代码显示如何构建一个完整的用户界面与他们。 这个时候你可以考虑使用FragmentStatePagerAdapter ,当使用FragmentStatePagerAdapter 时,如果Fragment不显示,那么Fragment对象会被销毁,( onSaveInstanceState(Bundle outState)方法来保存Fragment的状态,下次Fragment显示时通过onCreate(Bundle savedInstanceState)把存储的状态值取出来,FragmentStatePagerAdapter
fragmentContainer, 0, fragment); // 提交事务 fragments.finishUpdate(fragmentContainer); } // 使用FragmentStatePagerAdapter 管理Fragment FragmentStatePagerAdapter fragments = new FragmentStatePagerAdapter(getSupportFragmentManager
BGAStickyNavLayout 里面只能是包含三个子控件且第三个子控件为ViewPager时,其adapter必须是FragmentPagerAdapter或者 FragmentStatePagerAdapter android.support.v4.app.Fragment; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.app.FragmentStatePagerAdapter mDirectViewPager.getAdapter(); if (adapter instanceof FragmentPagerAdapter || adapter instanceof FragmentStatePagerAdapter IllegalStateException(BGAStickyNavLayout.class.getSimpleName() + "的第三个子控件为ViewPager时,其adapter必须是FragmentPagerAdapter或者FragmentStatePagerAdapter
但是一般来说,通常都会使用PagerAdapter的两个子类:FragmentPagerAdapter和FragmentStatePagerAdapter作为ViewPager的适配器,他们的特点是界面是 在support v13和support v4中都提供了FragmentPagerAdapter和FragmentStatePagerAdapter,区别在于:support v13中使用android.app.Fragment 一般都使用support v4中的FragmentPagerAdapter和FragmentStatePagerAdapter。 FragmentPagerAdapter和FragmentStatePagerAdapter需要重写的方法都一样,常见的重写方法如下: public FragmentPagerAdapter(FragmentManager
onVisibilityChanged(this.visible) } } AndroidX 的适配(也是一个坑) 在 AndroidX 当中,FragmentAdapter 和 FragmentStatePagerAdapter 构造方法 public FragmentStatePagerAdapter(@NonNull FragmentManager fm, @Behavior int behavior) { 已 FragmentStatePagerAdapter 为例,我们一起开看看源码 @SuppressWarnings({"ReferenceEquality", "deprecation"}) @Override 支持 viewPager 嵌套 fragment,主要是通过 setUserVisibleHint 兼容, * FragmentStatePagerAdapter BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT * 项目当中一级 ViewPager adapter 比较特殊,不是 FragmentPagerAdapter,也不是 FragmentStatePagerAdapter,导致这种方式用不了 */
FragmentPagerAdapter和FragmentStatePagerAdapter FragmentPagerAdapter适用于页面较少的情况,把UI分离,并没有回收,FragmentStatePagerAdapter
而且呢Google非常贴心的提供了两个类FragmentPagerAdapter和FragmentStatePagerAdapter来应付那些一般场景。 关于FragmentStatePagerAdapter,读者可自行分析,代码也不长。 4个方法可能太多,所以Google提供了FragmentPagerAdapter以及FragmentStatePagerAdapter,这两个也是抽象类,不过我们的自定义Adapter只需要实现其中的getItem 关于FragmentPagerAdapter以及FragmentStatePagerAdapter的不同,我这里再总结一下。 理解PagerAdapter,以及如何实现它 理解Google提供了两个特定场景的PagerAdapter实现类FragmentPagerAdapter以及FragmentStatePagerAdapter
titles.add("fragment4"); titles.add("fragment5"); viewPager.setAdapter(new FragmentStatePagerAdapter 看源码可以发现,FragmentStatePagerAdapter中比FragmentPagerAdapter多维护着两个列表: private ArrayList<Fragment.SavedState 而对于Fragment比较多的情况,需要切换的时候销毁以前的Fragment以释放内存,就可以使用FragmentStatePagerAdapter。 优化方案二:避免Fragment的销毁 不管是FragmentStatePagerAdapter还是FragmentPagerAdapter,其中都有一个方法可以被覆写: @Override 这也是FragmentStatePagerAdapter的精髓之处,如果注释掉,一旦Activity被回收进入异常销毁状态,Fragment就无法恢复之前的状态,因此这种方法也是有纰漏和局限性的。
方法六:使用FragmentStatePagerAdapter代替FragmentPagerAdapter 如果我们在使用ViewPager来显示 Fragment,可以考虑使用FragmentStatePagerAdapter FragmentStatePagerAdapter在销毁 Fragment 时会将其从内存中移除,而FragmentPagerAdapter则会保留所有的 Fragment 在内存中。 以下是使用FragmentStatePagerAdapter来解决上面的报错的示例代码: class MyFragmentPagerAdapter(fm: FragmentManager, lifecycle : Lifecycle) : FragmentStatePagerAdapter(fm, lifecycle) { override fun getItem(position: Int): Fragment 或者使用FragmentStatePagerAdapter代替FragmentPagerAdapter,避免在使用ViewPager时出现问题。
background">@drawable/actionbar_tab_indicator</item> </style> 让Activity继承FragmentActivity,定义一个继承自FragmentStatePagerAdapter getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setHomeButtonEnabled(true); //FragmentStatePagerAdapter //关联viewPager和FragmentStatePagerAdapter实例 viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager
FragmentStatePagerAdapter如何通过notifyDataSetChanged刷新ViewPager页面 对于FragmentStatePagerAdapter相对容易些,如果不需要考虑效率 即可,只需要复写其getItemPosition函数 public int getItemPosition(Object object) { return POSITION_NONE; } 因为FragmentStatePagerAdapter 对于ViewPager在使用FragmentPagerAdapter/FragmentStatePagerAdapter的时候都不会addToBackStack,这也是为什么detach跟remove有时候表现一致或者不一致的原因 f; } } } return null; } 总结 本文简单分析了下ViewPager在使用FrgmentPagerAdapter跟FragmentStatePagerAdapter
相同点: FragmentPagerAdapter和FragmentStatePagerAdapter都继承自PagerAdapter 不同点: 卸载不再需fragment时,各自采用的处理方法有所不同 FragmentStatePagerAdapter会销毁不需要的fragment。 FragmentStatePagerAdapter类名中的“state”表明:在销毁fragment时,可在onSaveInstanceState(Bundle)方法中保存fragment的Bundle 因此,FragmentPagerAdapter创建的fragment永远不会被销毁 也就是:在destroyItem()方法中,FragmentStatePagerAdapter调用的是remove() 但是有页面数据需要刷新的情况,不管是页面少还是多,还是要用FragmentStatePagerAdapter,否则页面会因为没有重建得不到刷新 使用如下: 1.
mContext = activity; } } 4.Fragment配合ViewPager ViewPager配合Fragment的时候,主要使用FragmentPagerAdapter和FragmentStatePagerAdapter return list.size(); } } 然后ViewPager.setAdapter(xxxx); 但是大家会奇怪为啥有二个Adapter:FragmentPagerAdapter和FragmentStatePagerAdapter FragmentStatePagerAdapter源码: public abstract class FragmentStatePagerAdapter extends PagerAdapter { //'可以看到都是通过remove的方式移除了' this.mCurTransaction.remove(fragment); } } 所以我们知道了FragmentStatePagerAdapter
ViewPager配合Fragment的时候,主要使用FragmentPagerAdapter和FragmentStatePagerAdapter这二个Adapter。 return list.size(); } } 复制代码 然后ViewPager.setAdapter(xxxx); 但是大家会奇怪为啥有二个Adapter:FragmentPagerAdapter和FragmentStatePagerAdapter FragmentStatePagerAdapter源码: public abstract class FragmentStatePagerAdapter extends PagerAdapter { //'可以看到都是通过remove的方式移除了' this.mCurTransaction.remove(fragment); } } 所以我们知道了FragmentStatePagerAdapter