Viewpager Fragment的懒加载包括两方面:
- 当页面对于用户可见时才请求数据
- 页面最多加载3个,即时销毁重建
第二个系统控件默认的就是这么个处理方式,这里主要分析第一个懒加载方式的实现。
第一个加载的fragment就不说了,不用懒加载,按照第二个来说(今日头条热点tab),先研究下生命周期,分为三种情况:
1、首次滑动到相邻页
“推荐”作为第一个页面不用懒加载,“热点”tab需要懒加载,生命周期的方法依次是:
setUserVisibleHint isVisibleToUser == false
onCreate
onCreateView inflate
onViewCreated initView
onResume
再滑到“热门”tab,开始加载数据
setUserVisibleHint isVisibleToUser==true getData
2、非首次滑动到相邻页(已经看过“热点”并且又被销毁,再次滑到“推荐”tab) 比如从“推荐”–》“热点”–》“视频”–》“北京”(此时热点销毁)–》“视频”(此时执行以下声明周期方法)–》“热点”
生命周期执行方法为:
setUserVisibleHint isVisibleToUser == false
onCreateView inflate
onViewCreated initView
onResume getData
setUserVisibleHint isVisibleToUser == true
3、直接点击tab(从“推荐”页,直接点击“视频”)
“视频”tab页面的生命周期执行方法:
setUserVisibleHint isVisibleToUser == false
onCreate (非首次不调用)
setUserVisibleHint isVisibleToUser == true
onCreateView inflate
onViewCreated initView
onResume getData
下面开始分析代码的实现
主要有三个方法:生成fragment的rootView方法inflate,初始化控件initView(),填充数据getData()。不管是哪种情况,都需要把这三个方法走且只走一次。
/**
* 懒加载机制标识
*/
protected boolean mHasLoaded = false;//是否加载过
protected boolean mHasCreated = false;//是否inflate过
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mHasCreated = true;
return inflater.inflate(R.layout.comm_end_load_listview_header, null);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
initView();
if(mIsVisibleToUser){
mHasLoaded = true;
}
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
mIsVisibleToUser = isVisibleToUser;
if (isVisibleToUser && !mHasLoaded && mHasCreated) {
initView();
getData();
mHasLoaded = true;
}
}
@Override
public void onResume() {
super.onResume();
if(mHasLoaded){
getData();
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
mHasCreated = false;
}