何为预加载:
因为该处使用到了Fragment+Viewpager+Tablayout的组合实现分类,因为viewpager V4包的机制,导致了在加载一个fragment时候,默认会加载它左右两边的两个fragment,源码显示是通过viewpager.setoffscreenpagelimit(1)来控制预加载的fragment的数量,该处默认最小值就是1,设为0并无效果,因此从源码端取消预加载是行不通的,经过多方调研,通过下面的方法可实现效果
首先新建一个BaseFragment基类,如下:
public abstract class BaseFragment extends Fragment {
public Context mContext;
protected View view;
protected boolean isVisible;
/**
* 是否初始视图完成
*/
private boolean isPrepared;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getActivity();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = bindLayout(inflater);
initView();
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//这里 初始化view的各控件 数据
isPrepared = true;
lazyLoad();
}
/**
* setUserVisibleHint是在onCreateView之前调用的
*
* @param isVisibleToUser
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
/**
* 判断是否可见
*/
if(getUserVisibleHint()) {
isVisible = true;
//执行可见方法-初始化数据之类
onVisible();
} else {
isVisible = false;
//不可见
onInvisible();
}
}
/**
* 可见做懒加载
*/
private void onVisible() {
lazyLoad();
}
/**
* 懒加载
*/
private void lazyLoad() {
/**
* 判断是否可见,或者 初始化view的各控件
*/
if(!isVisible || !isPrepared) {
return;
}
//可见 或者 控件初始化完成 就 加载数据
initData();
}
/**
* 不可见-做一些销毁工作
*/
protected void onInvisible() {
}
/**
* 绑定布局
*
* @param inflater
* @return
*/
public abstract View bindLayout(LayoutInflater inflater);
/**
* 初始化布局
*/
public abstract void initView();
/**
* 初始化数据
*/
protected abstract void initData();
}
该基类Fragment核心方法为:
setUserVisibleHint,在该方法中判断目标fragment是否可见,当可见的时候执行组件初始化和数据读取
在目标Fragment继承BaseFragment
重写这三个方法
这样就解决了预加载导致的冲突问题!