Android FragmentPagerAdapter与FragmentStatePagerAdapter
来源:互联网 发布:ug星空自动编程教程 编辑:程序博客网 时间:2024/05/22 15:43
FragmentPagerAdapter
FragmentPagerAdapter,见名知意,这个适配器就是用来实现Fragment在ViewPager里面进行滑动切换的,因此,如果我们想实现Fragment的左右滑动,可以选择ViewPager和FragmentPagerAdapter实现。
FragmentPagerAdapter是Android-support-v4支持包里面出现的一个新的适配器,继承自PagerAdapter,是专门用来给支持包中出现的ViewPager进行数据适配的。
FragmentPagerAdapter拥有自己的缓存策略,当和ViewPager配合使用的时候,会缓存当前Fragment以及左边一个、右边一个,一共三个Fragment对象。
假如有三个Fragment,那么在ViewPager初始化之后,3个fragment都会加载完成,中间的Fragment在整个生命周期里面只会加载一次,当最左边的Fragment处于显示状态,最右边的Fragment由于超出缓存范围,会被销毁,当再次滑到中间的Fragment的时候,最右边的Fragment会被再次初始化。
@Override public void destroyItem(ViewGroup container, int position, Object object) { if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object + " v=" + ((Fragment)object).getView());// detach 操作并没有真正销毁fragment实例 mCurTransaction.detach((Fragment)object); }
在当前版本来说,最适合用来做固定的较少数量的场合,比如说一个有3个tab标签的fragment滑动界面。FragmentPagerAdapter会对我们浏览过Fragment进行缓存,保存这些界面的临时状态,这样当我们左右滑动的时候,界面切换更加的流畅。但是,这样也会增加程序占用的内存。如果应用场景是更多的Fragment,请使用FragmentStatePagerAdapter。
当我们使用FragmentPagerAdapter的时候,它的宿主ViewPager必须有一个id。
如果要使用FragmentPagerAdapter,我们需要实现2个方法,如下所示。
FragmentPagerAdapter adapter = new FragmentPagerAdapter( getSupportFragmentManager()) { @Override public int getCount() { return fragments.size(); } @Override public Fragment getItem(int position) { return fragments.get(position); } } };
getCount()返回的是ViewPager页面的数量,getItem()返回的是要显示的fragent对象。
FragmentStatePagerAdapter
除了FragmentPagerAdapter之外,还有一个类也是专门实现ViewPager的Fragment的数据适配的,叫做FragmentStatePagerAdapter。
FragmentStatePagerAdapter是PagerAdapter的子类,这个适配器对实现多个Fragment界面的滑动是非常有用的,它的工作方式和listview是非常相似的。当Fragment对用户不可见的时候,整个Fragment会被销毁,只会保存Fragment的保存状态。基于这样的特性,FragmentStatePagerAdapter比FragmentPagerAdapter更适合用于很多界面之间的转换,而且消耗更少的内存资源。
@Override public void destroyItem(ViewGroup container, int position, Object object) { Fragment fragment = (Fragment)object; if (mCurTransaction == null) { mCurTransaction = mFragmentManager.beginTransaction(); } if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object + " v=" + ((Fragment)object).getView()); while (mSavedState.size() <= position) { mSavedState.add(null); } mSavedState.set(position, mFragmentManager.saveFragmentInstanceState(fragment)); mFragments.set(position, null); //销毁了fragment实例 mCurTransaction.remove(fragment); }
同样的,宿主VIewPager也必须有一个id。
如果要使用FragmentStatePagerAdapter,我们需要实现2个方法,getCount()返回的是ViewPager页面的数量,getItem()返回的是要显示的fragent对象。使用方法和FragmentPagerAdapter完全一样。
- Android FragmentPagerAdapter与FragmentStatePagerAdapter
- Android-- FragmentStatePagerAdapter与FragmentPagerAdapter分页
- <Android 进阶>FragmentStatePagerAdapter与FragmentPagerAdapter的区别
- Android Fragment两种适配FragmentPagerAdapter与FragmentStatePagerAdapter
- FragmentPagerAdapter与FragmentStatePagerAdapter差异
- FragmentPagerAdapter与FragmentStatePagerAdapter差异
- FragmentPagerAdapter与FragmentStatePagerAdapter差异
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- 【转】FragmentPagerAdapter与FragmentStatePagerAdapter
- FragmentPagerAdapter与FragmentStatePagerAdapter差异
- FragmentPagerAdapter与FragmentStatePagerAdapter差异
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- FragmentPagerAdapter与FragmentStatePagerAdapter区别
- Golang 在 Mac、Linux、Windows 下如何交叉编译
- poj 1456 贪心
- Android Menu菜单
- tp框架实现第三方QQ快捷登录
- Ruby on Rails 学习笔记(一 Ubuntu下配置Ruby on Rails)
- Android FragmentPagerAdapter与FragmentStatePagerAdapter
- 深入理解CSS伪类
- VS Code 呈现缩进参考线以及语法高亮改变
- 输入两个数,求最大公约数
- Oracle 增加修改删除字段与添加注释
- 单元测试
- Java:单例模式的七种写法
- Java面向对象设计模式(十二)——享元模式(Flyweight)
- nyoj 1275 导弹发射(河南省2016年省赛)