Fragment懒加载,简单解决页面切换数据重新加载问题
2019-03-18 本文已影响0人
林锦洲
前言
用过viewPage+Fragment的都知道当切换页面时,当页面切换超过2页,上上个页面会被销毁,重新切换回去时fragment会重新创建。下面2种方法可以解决fragment重新创建数据重新加载的问题。
一、setOffscreenPageLimit()
直接设置viewPage的setOffscreenPageLimit()
。setOffscreenPageLimit()
方法设置的默认值是1。这个设置的值有两层含义: 一是 ViewPager 会预加载几页; 二是 ViewPager 会缓存 2*n+1 页(n为设置的值)。setOffscreenPageLimit()
可以简单粗暴的解决数据重新加载问题。但是如果像今日头条有多个Fragment呢?那就可以用Fragment懒加载了
二、Fragment懒加载
保证只有第一次创建时会加载数据,代码如下:
public abstract class LazyloadFragment extends Fragment {
private View mView;
private boolean hasLoadData = false; // 是否已加载数据
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mView= inflater.inflate(R.layout.fragment_lazyload, null);
return mView;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
// 如果setUserVisibleHint()在mView 创建前调用时,那么
// 就等到rootView创建完后才回调onFragmentVisibleChange(true)
// 保证onFragmentVisibleChange()的回调发生在mView 创建完成之后,防止mView == null
if (getUserVisibleHint()) {
if (!hasLoadData) {
// 一般是第一次打开TabActivity页面时,当前Fragment会走这里
loadData();
hasLoadData = true;
}
}
super.onViewCreated(view, savedInstanceState);
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// setUserVisibleHint在初始化Fragment的时候也会调用,且在onCreateView之前,所以mView会为null
// mView是否初始化标志,防止回调函数在mView为空的时候触发
if (mView == null) {
return;
}
if (!hasLoadData && isVisibleToUser) {
loadData();
hasLoadData = true;
}
}
private void loadData(){
// 加载数据
}
}