网上找了比较多的例子,但总是不太符合心意,于是就造轮子。
本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个标识
- needInitData
默认true 表示需要初始化 - isInitView
默认false 是否已经初始化view
第一个fragment流程
进入 setUserVisibleHint(boolean isVisibleToUser)方法此时 getUserVisibleHint()的值是fase。之后就进入lazyLoad()进行初始化判断
由于getUserVisibleHint()=fase 所有会跳出条件然后就会去操作第二个fragment 了
然后就又回到第一个的setUserVisibleHint(boolean isVisibleToUser)方法,
此时getUserVisibleHint()=true,再进入lazyLoad()进行初始化判断,此时的isInitView=fase ,条件不成立,跳出最后才到onCreateView()方法,进入view的初始化,然后再到lazyLoad()进行判断, 此时isInitView=true ,needInitData = true,getUserVisibleHint()=true条件成立,进入initView(View view) 进行控件的初始化和数据加载了,此时needInitData=fase,之后的操作都不会进入 initView()方法了。
预加载fragment流程(第二个fragment)
第一个fragment 先进入 setUserVisibleHint(boolean isVisibleToUser)方法
第二个也进入 setUserVisibleHint(boolean isVisibleToUser)方法,getUserVisibleHint()=fase ,进入lazyLoad()进行初始化判断,条件不成立
第二个进入onCreateView()方法 ,getUserVisibleHint()=fase ,进入lazyLoad()进行初始化判断,条件不成立
第一个fragment 滑到第二个 ,第二个fragment会到setUserVisibleHint(boolean isVisibleToUser)方法,此时 getUserVisibleHint()的值是true。之后就进入lazyLoad()进行初始化判断由于所有条件都成立 进入条件,进入 initView()进行控件的初始化和数据加载了,此时needInitData=fase,之后的操作都不会进入 initView()方法了。
以上就完成了简易版 viewpager+fragment懒加载的实现。
关于
Fastandrutils 是一套整理修改整合的android开发常用的工具类。
这样可以减少复制粘贴代码,从而减少重复代码,也不用为了一个常用的功能去谷歌百度,让代码更简洁,让开发更高效。
同时希望您的添加完善,让android开发变得更简单。
github地址,感兴趣的话,不妨点赞支持下
个人博客