ViewPager加载较多个Fragment的时候为防止频繁访问接口,只加载当前显示页面的数据。
/**
* 数据懒加载方式
* 原理:
* 1、该页面是否首次加载(当数据加载完成之后,置反)
* 2、页面是否可见
* 3、控件是否初始化完成(view的初始化虽然实在onCreateview方法中进行的但是在该发放中记录变量的话不一定准确,根据生命周期来看,onActivityCreated 在它之后执行所以放在它里面记录变量比较准确)
* create by czk at 2019-10-14
*/
public abstract class BaseLazyFragment extends BaseFragment {
private boolean isFirst = true;//页面中的数据是否是第一次加载
private boolean isPrepared = false; //view初始化是否完成
/**
* 页面是否可见
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
lazyLoad();
}
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView(view);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
isPrepared = true;
}
@Override
public void onStart() {
super.onStart();
if (getUserVisibleHint()) {
setUserVisibleHint(true);
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
resetState();
}
private void lazyLoad() {
if (!isFirst || !isPrepared) {
return;
}
isFirst = false;
initData();
}
private void resetState() {
isFirst = true;
isPrepared = false;
}
protected abstract void initData();
}
关键的方法:setUserVisibleHint() 页面是否可见
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
}
实现流程:用三个变量来判断是否要加载数据
1、页面是否是首次加载数据
2、页面是否可见
3、view是否初始化完成了
ps: 1、如果你想要所有的fragment不销毁并且每个页面加载一次数据,请设置viewPager.setOffscreenPageLimit()
2、大家节日快乐~~~~~~~~~