所谓懒加载,即用户切到对应的fragment时才加载数据(Android默认加载可见fragment和可见fragment的左右fragment即3个fragment数据,这样可能会导致界面产生卡顿)
如何判断fragment是否可见
Fragmet提供了一个setUserVisibleHint
方法里有个isVisibleToUser
参数如果为True则为可见否则为不可见:
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser ) {
//可见
}else{
//不可见
}
}
setUserVisibleHint 在什么时候调用?
对于单个 Fragment,setUserVisibleHint
是不会被调用的,只有该 Fragment 在 ViewPager 里才会被调用。而setUserVisibleHint
在fragment的生命周期调用顺序如下
-> setUserVisibleHint(false)
-> onAttach
-> onCreate
-> setUserVisibleHint(true)
-> onCreateView
-> onActivityCreated
-> ....
-> onDetach
LazyFragment
了解了原理,现在改写Fragment,增加loadData方法来进行数据加载
/**
* Created by JokAr on 16/8/10.
*/
public abstract class LazyFragment extends Fragment {
//控件是否已经初始化
private boolean isCreateView = false;
//是否已经加载过数据
public boolean isLoadData = false;
/**
* 返回layoutView
* @param inflater
* @param container
* @return
*/
public abstract View getView(LayoutInflater inflater, ViewGroup container);
/**
* 初始化控件
*/
public abstract void initViews(View view);
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = getView(inflater, container);
initViews(view);
isCreateView = true;
return view;
}
//此方法在控件初始化前调用,所以不能在此方法中直接操作控件会出现空指针
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser && isCreateView && !isLoadData) {
loadData();
}
}
/**
* 加载数据
*/
public void loadData() {
//如果没有加载过就加载,否则就不再加载了
if (!isLoadData) {
//加载数据操作
isLoadData = true;
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//第一个加载fragment会调用
if (getUserVisibleHint())
loadData();
}
}
这样就完成了,
getView
返回fragment的layout,initViews
初始化控件,loadData
加载数据
注意viewPager不保存Fragment问题
- 参考:http://blog.csdn.net/guo807015563/article/details/42081799
- 或者设置
viewPager.setOffscreenPageLimit