Fragment懒加载实现,BaseFragment封装
2019-03-15 本文已影响1017人
打酱油的日光灯
抓住人生中的一分一秒,胜过虚度中的一月一年!
前言
在实际开发中,fragment使用经常会结合viewpager一起使用,页面可能会由三个或更多Fragment构成,每个fragment可能都是由复杂的布局结构所组成,这个时候直接加载出来,或是默认加载两三个都是有点耗费资源的,可能还会比较卡顿,所以懒加载这一名词就会提上议程
对于懒加载,通俗点讲就是看不见的不需要的不加载,当需要时再进行加载,让体验(页面绘制),流量等更节省
思路(其实很简单,思路明确了很好理解)
fragment中有一个setUserVisibleHint函数,此函数含义为 “当fragment被用户可见时,setUserVisibleHint()会调用且传入true值,当fragment不被用户可见时,setUserVisibleHint()则得到false值。”
了解了这个函数之后,稍微封装一下不就实现了懒加载了吗?
实现目标
1、布局初始化后,才能加载数据
2、界面是否可见后,才能加载数据
3、是否加载过数据,如果加载过,就不重复加载
4、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)
实现步骤
1、布局初始化后进行加载数据
/**
* 是否初始化过布局
*/
protected boolean isViewInitiated;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated=true;
//加载数据方法
prepareFetchData();
}
2、界面可见了加载数据
/**
* 当前界面是否可见
*/
protected boolean isVisibleToUser;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
if (isVisibleToUser) {
prepareFetchData();
}
}
3、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)
public void prepareFetchData() {
prepareFetchData(false);
}
4、加载过数据,就不重复加载
/**
* 是否加载过数据
*/
protected boolean isDataInitiated;
public void prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
loadData();
isDataInitiated = true;//不再重复加载
}
}
5、加载数据
/**
* 判断懒加载条件
*
* @param forceUpdate 强制更新,没啥用
*/
public void prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
loadData();
isDataInitiated = true;
}
}
/**
* 懒加载
*/
protected abstract void loadData();
下面介绍下子类Fragment如何使用
public class TextFragment extends BaseFragment{
@Override
protected BasePresenter createPresenter() {
return null;
}
@Override
protected int getLayoutId() {
return R.layout.fragment_base;
}
@Override
protected void initData() {
}
@Override
protected void loadData() {
//加载数据
}
}
全部BaseFragment代码如下
/**
* File descripition:
*
* @author lp
* @date 2019/3/15
*/
public abstract class BaseFragment extends Fragment {
public View view;
public Activity mContext;
/**
* 是否初始化过布局
*/
protected boolean isViewInitiated;
/**
* 当前界面是否可见
*/
protected boolean isVisibleToUser;
/**
* 是否加载过数据
*/
protected boolean isDataInitiated;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(getLayoutId(), container, false);
ButterKnife.bind(this, view);
mContext = getActivity();
this.initData();
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isViewInitiated=true;
//加载数据
prepareFetchData();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
this.isVisibleToUser = isVisibleToUser;
if (isVisibleToUser) {
prepareFetchData();
}
}
public void prepareFetchData() {
prepareFetchData(false);
}
/**
* 判断懒加载条件
*
* @param forceUpdate 强制更新,好像没什么用?
*/
public void prepareFetchData(boolean forceUpdate) {
if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
loadData();
isDataInitiated = true;
}
}
/**
* 懒加载
*/
protected abstract void loadData();
/**
* 获取布局ID
*
* @return
*/
protected abstract int getLayoutId();
/**
* 数据初始化操作
*/
protected abstract void initData();
@Override
public void onDestroy() {
super.onDestroy();
this.view = null;
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.bind(getActivity()).unbind();
}
/**
* [页面跳转]
*
* @param clz
*/
public void startActivity(Class<?> clz) {
startActivity(clz, null);
}
/**
* [携带数据的页面跳转]
*
* @param clz
* @param bundle
*/
public void startActivity(Class<?> clz, Bundle bundle) {
Intent intent = new Intent();
intent.setClass(getActivity(), clz);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivity(intent);
}
/**
* [含有Bundle通过Class打开编辑界面]
*
* @param cls
* @param bundle
* @param requestCode
*/
public void startActivityForResult(Class<?> cls, Bundle bundle,
int requestCode) {
Intent intent = new Intent();
intent.setClass(getActivity(), cls);
if (bundle != null) {
intent.putExtras(bundle);
}
startActivityForResult(intent, requestCode);
}
}
最后,祝大家创作愉快