viewpage里fragment懒加载与缓存已经创建的fragment

以下内容来源于网络收集:

新闻类应该最常见的就是viewpage,Fragment.

懒加载的方式基本都是通过setUserVisibleHint的方式来判断当前的Fragment是不是可见,但是如果想只有第一次加载数据后面再显示不加载数据,就必须还要做一些其他的判断
下面直接看代码:

1 private boolean hasCreateView = false; 2 private boolean isFragmentVisible; 3 private boolean isFirstVisible; 4 5//setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false 6 //如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true 7 //如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false 8 //总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调 9 //如果我们需要在 Fragment 可见与不可见时干点事,用这个的话就会有多余的回调了,那么就需要重新封装一个 10 @Override 11 public void setUserVisibleHint(boolean isVisibleToUser) { 12 super.setUserVisibleHint(isVisibleToUser); 13 //setUserVisibleHint()有可能在fragment的生命周期外被调用 14 if (!hasCreateView) { 15 return; 16 } 17 18 if (isFirstVisible && isVisibleToUser) { 19 onFragmentFirstVisible(); 20 isFirstVisible = false; 21 } 22 if (isVisibleToUser) { 23 onFragmentVisibleChange(true); 24 isFragmentVisible = true; 25 return; 26 } 27 if (isFragmentVisible) { 28 isFragmentVisible = false; 29 onFragmentVisibleChange(false); 30 } 31 } 32 33 @Override 34 public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 35 //如果setUserVisibleHint()在rootView创建前调用时,那么 36 //就等到View创建完后才回调onFragmentVisibleChange(true) 37 //保证onFragmentVisibleChange()的回调发生在View创建完成之后,以便支持ui操作 38 if (!hasCreateView) { 39 hasCreateView = true; 40 if (getUserVisibleHint()) { 41 hasCreateView = true; 42 if (isFirstVisible) { 43 onFragmentFirstVisible(); 44 isFirstVisible = false; 45 } 46 onFragmentVisibleChange(true); 47 isFragmentVisible = true; 48 } 49 } 50 51 super.onViewCreated(view, savedInstanceState); 52 } 53 54 /** * 去除setUserVisibleHint()多余的回调场景,保证只有当fragment可见状态发生变化时才回调 * 回调时机在view创建完后,所以支持ui操作,解决在setUserVisibleHint()里进行ui操作有可能报null异常的问题 * * 可在该回调方法里进行一些ui显示与隐藏,比如加载框的显示和隐藏 * * @param isVisible true 不可见 -> 可见 * false 可见 -> 不可见 */ 55 protected void onFragmentVisibleChange(boolean isVisible) { 56 57 } 58 59 /** * 在fragment首次可见时回调,可在这里进行加载数据,保证只在第一次打开Fragment时才会加载数据, * 这样就可以防止每次进入都重复加载数据 * 该方法会在 onFragmentVisibleChange() 之前调用,所以第一次打开时,可以用一个全局变量表示数据下载状态, * 然后在该方法内将状态设置为下载状态,接着去执行下载的任务 * 最后在 onFragmentVisibleChange() 里根据数据下载状态来控制下载进度ui控件的显示与隐藏 */ 60 protected void onFragmentFirstVisible() { 61 62 } 63 64 protected boolean isFragmentVisible() { 65 return isFragmentVisible; 66 } 67 68 @Override 69 public void onCreate(@Nullable Bundle savedInstanceState) { 70 super.onCreate(savedInstanceState); 71 initVariable(); 72 } 73 74 @Override 75 public void onDestroy() { 76 initVariable(); 77 super.onDestroy(); 78 } 79 80 private void initVariable() { 81 isFirstVisible = true; 82 isFragmentVisible = false; 83 hasCreateView = false; 84 }

基本思路就是判断但是是不是已经view创建好了,是不是显示了,如果都是那就进行相应的回调

2.如果要进行Fragment的缓存就在adpter里进行数组保存,然后重写下面的方法

1 @Override 2 public int getItemPosition(Object object) { 3 return POSITION_NONE; 4 }

这样每次加载Fragment的时候都会认为没有缓存需要调用getItem方法,这样就不会受viewPager 的 setOffscreenPageLimit影响,导致不会调用getItem方法

点赞
收藏

评论区

加载中...

相关推荐

vue 路由懒加载

原文链接: vue路由懒加载(https://my.oschina.net/ahaoboy/blog/1796979)路由懒加载当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。结合Vue的异步组件

vue 路由 懒加载

原文链接: vue路由懒加载(https://my.oschina.net/ahaoboy/blog/1618024)路由懒加载当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。结合Vue的异步组

Egret白鹭开发小游戏之自定义load加载界面

刚接触不久就遇到困难自定义loading。想和其他获取图片方式一样获取加载界面的图片,结果发现资源还没加载就需要图片,在网上百度了许多,都没有找到正确的方式,通过自己的摸索,终于,,,我成功了。。。下面介绍一下主要思想:首先,我们需要使用异步加载的方式,在加载界面之前加载loading界面需要的素材,然后再loadingUI中就可以大胆使

Glide

1.with函数可以传入activity,fragment,context,传入的参数会决定glide加载图片的生命周期,当activity,fragment被销毁的时候,加载就会停止  with函数首先判断了是否在主线程中使用,如果不在主线程中使用,那么传入的参数就相当于applicationContext,在主线程中使用,就要判断是不是applica

Fragment和FragmentActivity的使用方法 .

认识:首先我们知道Fragment是我们在单个Activity上要切换多个UI界面,显示不同内容。模块化这些UI面板以便提供给其他Acitivity使用便利。同时我们显示的Fragment也会受到当前的这个Acitivity生命周期影响。(而平常的Fragment有其自己的生命周期)一、使用方法:1、创建一个或者多个你需要的Fragment类,其实就

Angular性能优化实践——巧用第三方组件和懒加载技术

应该有很多人都抱怨过Angular应用的性能问题。其实,在搭建Angular项目时,通过使用打包、懒加载、变化检测策略和缓存技术,再辅助第三方组件,便可有效提升项目性能。为了帮助开发者深入理解和使用Angular,本文将以我司客户中最为典型的业务场景——在线表格编辑为例,演示如何借助懒加载技术,在基于Angular的框架中实现在线导入导出Excel