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地址,感兴趣的话,不妨点赞支持下
个人博客

你可能感兴趣的:(viewpager+fragment实现懒加载)