viewpager+fragment实现懒加载

viewpager+fragment实现懒加载

懒加载

网上找了比较多的例子,但总是不太符合心意,于是就造轮子。
本fragment基类是利用了setUserVisibleHint()方法来实现的,基本满足简易版懒加载需求。


import android.os.Bundle; import android.support.annotation.LayoutRes; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * @author laijian * @Copyright (C)2018-06-08 16:33:51 , www.hotapk.cn */ public abstract class FLazyFragment extends Fragment { private View rootView; private boolean needInitData = true;//初始化数据标识 private boolean isInitView = false;//是否初始化view public FLazyFragment() { } public abstract @LayoutRes int setLayoutRes(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (rootView == null) { isInitView = true; rootView = inflater.inflate(setLayoutRes(), container, false); } ViewGroup parent = (ViewGroup) rootView.getParent(); if (parent != null) { parent.removeView(rootView); } lazyLoad(); return rootView; } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); lazyLoad(); } private void lazyLoad() { if (getUserVisibleHint() && needInitData && isInitView) { needInitData = false; if (rootView != null) { initView(rootView); } } } public abstract void initView(View view); }

然后fragment 在FragmentPagerAdapter 中数据是不会丢失的,只是会重新调用onCreateView()

既然数据不会丢失,所有应该是可以缓存View的

FLazyFragment 类中还有2个标识

  1. needInitData
    默认true 表示需要初始化
  2. isInitView
    默认false 是否已经初始化view

第一个fragment流程

  1. 进入 setUserVisibleHint(boolean isVisibleToUser)方法此时 getUserVisibleHint()的值是fase。之后就进入lazyLoad()进行初始化判断
    由于getUserVisibleHint()=fase 所有会跳出条件

  2. 然后就会去操作第二个fragment 了

  3. 然后就又回到第一个的setUserVisibleHint(boolean isVisibleToUser)方法,
    此时getUserVisibleHint()=true,再进入lazyLoad()进行初始化判断,此时的isInitView=fase ,条件不成立,跳出

  4. 最后才到onCreateView()方法,进入view的初始化,然后再到lazyLoad()进行判断, 此时isInitView=true ,needInitData = true,getUserVisibleHint()=true条件成立,进入initView(View view) 进行控件的初始化和数据加载了,此时needInitData=fase,之后的操作都不会进入 initView()方法了。

预加载fragment流程(第二个fragment)

  1. 第一个fragment 先进入 setUserVisibleHint(boolean isVisibleToUser)方法

  2. 第二个也进入 setUserVisibleHint(boolean isVisibleToUser)方法,getUserVisibleHint()=fase ,进入lazyLoad()进行初始化判断,条件不成立

  3. 第二个进入onCreateView()方法 ,getUserVisibleHint()=fase ,进入lazyLoad()进行初始化判断,条件不成立

  4. 第一个fragment 滑到第二个 ,第二个fragment会到setUserVisibleHint(boolean isVisibleToUser)方法,此时 getUserVisibleHint()的值是true。之后就进入lazyLoad()进行初始化判断由于所有条件都成立 进入条件,进入 initView()进行控件的初始化和数据加载了,此时needInitData=fase,之后的操作都不会进入 initView()方法了。

以上就完成了简易版 viewpager+fragment懒加载的实现。

关于

Fastandrutils 是一套整理修改整合的android开发常用的工具类。
这样可以减少复制粘贴代码,从而减少重复代码,也不用为了一个常用的功能去谷歌百度,让代码更简洁,让开发更高效。
同时希望您的添加完善,让android开发变得更简单。

github地址,感兴趣的话,不妨点赞支持下
个人博客

发表评论

电子邮件地址不会被公开。 必填项已用*标注