image.png FragmentPagerAdapter FragmentPagerAdapter是android-support-v4支持包里面出现的一个新的适配器,继承自PagerAdapter 和FragmentPagerAdapter实现。 FragmentPagerAdapter拥有自己的缓存策略,当和ViewPager配合使用的时候,会缓存当前Fragment以及左边一个、右边一个,一共三个Fragment对象。 FragmentPagerAdapter会对我们浏览过Fragment进行缓存,保存这些界面的临时状态,这样当我们左右滑动的时候,界面切换更加的流畅。但是,这样也会增加程序占用的内存。 代码实例: FragmentPagerAdapter adapter = new FragmentPagerAdapter( getSupportFragmentManager
复写pageradapter的getItemPosition方法设置tag为POSITION_NONE意思是没有找到child要求重新加载。
1.FragmentPagerAdapter FragmentPagerAdapter 继承自 PagerAdapter。 FragmentPagerAdapter 重载实现了几个必须的函数,因此来自 PagerAdapter 的函数,我们只需要实现 getCount(),即可。 且,由于 FragmentPagerAdapter.instantiateItem() 的实现中,调用了一个新增的虚函数 getItem(),因此,我们还至少需要实现一个 getItem()。 FragmentPagerAdapter 会将所有生成的 Fragment 对象通过 FragmentManager 保存起来备用,以后需要该 Fragment 时,都会从 FragmentManager 2.FragmentStatePagerAdapter FragmentStatePagerAdapter 和前面的 FragmentPagerAdapter 一样,是继承子 PagerAdapter
然而我找到了一个比较推荐的方法:ViewPager使用FragmentPagerAdapter适配器。 FragmentPagerAdapter派生自PagerAdapter,它是用来呈现Fragment页面的。 ---- ****适配器实现 - FragmentPagerAdapter**** /** * Home页面的适配器adapter * Created by alic on 16-4-30. */ public class HomeFragmentAdapter extends FragmentPagerAdapter{ private List<Fragment> fragmentList
最近工作中UI给出如图设计,心想这个结合viewpager,fragment,FragmentPagerAdapter就能构建出来. ? 出乎意料啊,赶紧看下FragmentPagerAdapter 官方文档 Implementation of PagerAdapter that represents each page as a Fragment 结合其他google结果,大致意为FragmentPagerAdapter中所创建出来的fragment会被fragment manager保存,也即在内存中. 结论:FragmentPagerAdapter和viewpager滑动白屏无数据,是由于恢复内存中的fragment的数据丢失,需要自己做手动数据保存,这样才能避免此情况的出现.
会保存左右各一个界面,采用栈存储信息,page1234,从2开始滑动到3,会删除1,添加4,从OnCreateview开始OnDestoryView结束。第一次添加会从生命周期开始走,OnCreate。
setMaxLifecycle的原理和上手效果; 阅读指南: 本文基于androidx 1.1.0-alpha07版本的fragment进行,也是支持setMaxLifecycle的最低版本 本文会根据FragmentPagerAdapter 由于篇幅原因,就不一一介绍各种组合情况,只要弄清楚生命周期状态,不论是状态是升还是降,不论组合还是单用,你都可以驾驭; FragmentPagerAdapter变动 由于setMaxLifecycle带来了生命周期设置 ,替换掉了老旧的setUserVisibleHint方法,所以在FragmentPagerAdapter中也进行了适配 FragmentPagerAdapter public static final (@NonNull FragmentManager fm) { this(fm, BEHAVIOR_SET_USER_VISIBLE_HINT); } public FragmentPagerAdapter (getSupportFragmentManager(),FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 总结 破事水了小半天,本文到底说了什么内容
Fragment>(); fragmentContainter.add(f1); fragmentContainter.add(f2); fragmentContainter.add(f3); 3、用FragmentPagerAdapter 关联上面的Fragment和ViewPager, FragmentPagerAdapter (android.support.v4.app.FragmentPagerAdapter) 继承自 PagerAdapter 我们只需要实现 getCount() 和 getItem()即可,从getItem()可以看出,它返回的是v4的Fragment,所以2中的问题答案就在这里了~~ pager.setAdapter(new FragmentPagerAdapter return fragmentContainter.get(arg0); } }); 这样就可以实现滑动Fragment 重要的话 PageAdapter 是 FragmentPagerAdapter FragmentStatePagerAdapter 和 FragmentPagerAdapter 的区别: FragmentPagerAdapter使用时,每一个生成的 Fragment 都将保存在内存之中
不由得有些好奇,随跟踪了部分源码,简单整理如下: ViewPager+FragmentPagerAdapter为何不能通过setAdapter做到整体刷新 第二次设置PagerAdapter的时候,首先会将原来的 为什么呢,因为第二次setAdapter的时候,已经被FragmentManager缓存的Fragent不会被新建,也不会被刷新,因为FragmentPagerAdapter在调用destroy的时候, FragmentPagerAdapter如何通过notifyDataSetChanged刷新ViewPager FragmentPagerAdapter中的数据发生改变时,往往要重新将数据设置到Fragment 并且到这里我们也知道了,对于FragmentPagerAdapter来说,用户完全不需要自己缓存Fragment,只需要缓存View,因为FragmentPagerAdapter不会销毁Fragment 作者:看书的小蜗牛 原文链接:ViewPager刷新问题原理分析及解决方案(FragmentPagerAdapter+FragementStatePagerAdapter) 仅供参考,欢迎指正
Viewpager 获取当前显示的fragment 使用 getSupportFragmentManager().findFragmentByTag()方法 Viewpager + FragmentPagerAdapter 情况下 才好使; FragmentPagerAdapter 有一个特点 凡是加载过的Fragment 都会被保留,既然Fragment不会被销毁,那我们就可以使用findFragmentByTag() 方法找到它;但问题是动态创建的话 tag的设置;我们知道动态加载时是可以设置tag的,但是动态创建就没法设置了;如果viewpager使用的是适配器是 FragmentPagerAdapter 的话 固定部分 switcher : 固定部分 2131492976 : ViewPager 的id 0 : ViewPager 当前显示的itemPostion 既然FragmentPagerAdapter 就可以利用这个特点通过 findFragmentByTag() 找到这个Fragment //Viewpager + FragmentPagerAdapter 情况下 获取 当前显示的Fragment,
第二页面向第三个页面滑动 一、概述 从前面几篇文章,我们知道,实现ViewPager是要有适配器的,我们前面用的适配器是PagerAdapter,而对于fragment,它所使用的适配器是:FragmentPagerAdapter When using FragmentPagerAdapter the host ViewPager must have a valid ID set. 译文:(译的不好,大家可在评论中补充) FragmentPagerAdapter派生自PagerAdapter,它是用来呈现Fragment页面的,这些Fragment页面会一直保存在fragment 每一个使用FragmentPagerAdapter的ViewPager都要有一个有效的ID集合,有效ID的集合就是Fragment的集合(感谢夫诸同学的提示) 对于FragmentPagerAdapter 二、具体实现 1、适配器实现——FragmentPagerAdapter 先看完整代码,再细讲: public class FragAdapter extends FragmentPagerAdapter
用相应的适配器Adapter关联上面的页卡(View/Fragment)和ViewPager: PagerAdapter 数据源:List FragmentPagerAdapter 数据源:List FragmentStatePagerAdapter ; public class MyFragmentAdapter extends FragmentPagerAdapter { List<Fragment> list; public MyFragmentAdapter viewPager.setOnPageChangeListener(new MyOnPageChangeListener());//设置页面切换时候的监听器(可选,用了之后要重写它的回调方法处理页面切换时候的事务) FragmentPagerAdapter FragmentStatePagerAdapter 和 FragmentPagerAdapter 的异同: 同 PageAdapter 是 FragmentPagerAdapter 以及 FragmentStatePagerAdapter 的基类,可将上面的FragmentPagerAdapter 替换成FragmentStatePagerAdapter 异 FragmentPagerAdapter使用时,每一个生成的 Fragment
用相应的适配器Adapter关联上面的页卡(View/Fragment)和ViewPager: PagerAdapter 数据源:List FragmentPagerAdapter 数据源:List ; public class MyFragmentAdapter extends FragmentPagerAdapter { List<Fragment> list; public 的滑动接口OnPageChangeListener()如何使用,请看我写的另外一篇文章:Android开发:ViewPage滑动接口最详细解析 FragmentStatePagerAdapter 和 FragmentPagerAdapter 的异同: 同 PageAdapter 是 FragmentPagerAdapter 以及 FragmentStatePagerAdapter 的基类,可将上面的FragmentPagerAdapter 替换成FragmentStatePagerAdapter 异 FragmentPagerAdapter使用时,每一个生成的 Fragment 都将保存在内存之中,而 FragmentStatePagerAdapter
FragmentPagerAdapter和FragmentStatePagerAdapter这两个类都有简单的代码显示如何构建一个完整的用户界面与他们。 android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter ; /** * 自定义fragment适配器 * @author ZHF * */ public class MyFragmentPageAdapter extends FragmentPagerAdapter 事实上使用FragmentPagerAdapter 时,Fragment对象会一直存留在内存中,所以当有大量的显示页时,就不适合用FragmentPagerAdapter了,FragmentPagerAdapter
于是改变想法,采用 了底部大类导航栏加顶端Tab小类导航加ViewPager的导航模式,有点像微信的导航模式(某种程度上来 说有完全不像,笑),主要涉及到ViewPager,Fragment,FragmentPagerAdapter 布局中(注意设置layout_weight以保证占满屏幕) 中间的分割线可以考虑通过ImageView来实现(设置高度1dp,background为灰) 小类下的细分(使用ViewPager+FragmentPagerAdapter 实现) 顶端的两个Tab可以考虑使用TextView+绘制滑动条来实现 重写FragmentPagerAdapter: public class MyFragmentPagerAdapter extends FragmentPagerAdapter { private ArrayList<Fragment> fragmentsList; public MyFragmentPagerAdapter
但是一般来说,通常都会使用PagerAdapter的两个子类:FragmentPagerAdapter和FragmentStatePagerAdapter作为ViewPager的适配器,他们的特点是界面是 在support v13和support v4中都提供了FragmentPagerAdapter和FragmentStatePagerAdapter,区别在于:support v13中使用android.app.Fragment 一般都使用support v4中的FragmentPagerAdapter和FragmentStatePagerAdapter。 FragmentPagerAdapter和FragmentStatePagerAdapter需要重写的方法都一样,常见的重写方法如下: public FragmentPagerAdapter(FragmentManager 这里就实现类似微信那种效果,整个UI布局为:底部用PagerBottomTabStrip项目实现,上面是ViewPager,使用FragmentPagerAdapter。
而且呢Google非常贴心的提供了两个类FragmentPagerAdapter和FragmentStatePagerAdapter来应付那些一般场景。 和FragmentStatePagerAdapter,我们这节分析FragmentPagerAdapter。 FragmentPagerAdapter也是个抽象类, * */ public abstract class FragmentPagerAdapter extends PagerAdapter { private static final String TAG = "FragmentPagerAdapter"; private static final boolean DEBUG 关于FragmentPagerAdapter以及FragmentStatePagerAdapter的不同,我这里再总结一下。
ViewPager嵌套Fragment 新建4个Fragment; 新建ViewPagerAdapter继承FragmentPagerAdapter; public class ViewpagerAdapter extends FragmentPagerAdapter { private ArrayList<Fragment> arrayList; public ViewpagerAdapter
的懒加载更加科学,可以配合 Livedata 等组件在MVVM架构中使用 setMaxLifeCycle 无需额外定义 Fragment 基类,使用起来更加无侵 使用 setMaxLifecycle 进行懒加载 FragmentPagerAdapter 的构造方法新增了一个 behavior 参数, 当被设置为FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT时,会通过setMaxLifecycle fm: FragmentManager, behavior: Int, val fragmentList: List<Fragment> ) : FragmentPagerAdapter ) = fragmentList.size override fun getItem(position: Int) = fragmentList[position] } } FragmentPagerAdapter //FragmentPagerAdapter.java public FragmentPagerAdapter(@NonNull FragmentManager fm, @Behavior
.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter (vp_content, 0); } } /** * 标签部分适配器 * * @author taoshihan * */ class TabAdapter extends FragmentPagerAdapter