我们通常使用Fragment+ViewPager实现页面的切换,在ViewPager的默认机制中,我们能设置预加载个数
vpContent.setOffscreenPageLimit(2);这样能提高ViewPager的一些流畅性,但是很多时候我们并不需要
加载下一个页面,我们希望切换到那一页才开始加载,也能为用户节省流量,所以就有了懒加载,懒加载说
简单也简单,因为就一个方法,setUserVisibleHint如下
//会在oncreatView之前调用
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()){
isVisble = true;
onVisible();
}else {
isVisble = false;
onInvisble();
}
}
最近写些东西练手,用到了ViewPager+Fragment的组合,然后封装了一个基类,基本实现了懒加载功能,
当然可能会有一些不足,大家如果有好的想法欢迎指正,以下是整个Fragment的基类,代码不多,就简单封装了下,大家主要看懒加载吧
/**
* A simple {@link Fragment} subclass.
* fragment的封装基类
*/
public abstract class BaseFragment extends Fragment {
protected Context mContext;
protected View view;
protected Unbinder unbinder;
protected CompositeDisposable compositeDisposable = new CompositeDisposable();
//是否可见
protected boolean isVisble=false;
//是否初始化完成
protected boolean isPrepared = false;
//是否第一次加载完成
protected boolean isFirstLoaded = false;
//第一个默认的fragment是否加载
protected boolean isGankFirstLoad = false;
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext = context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
view = inflater.inflate(setContent(), container,false);
unbinder = ButterKnife.bind(this, view);
initView();
//初始化结束后,设为true
isPrepared = true;
setListener();
return view;
}
protected void setListener() {
}
//会在oncreatView之前调用
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()){
isVisble = true;
//可见的操作
onVisible();
}else {
isVisble = false;
onInvisble();
}
}
protected void onInvisble() {
}
protected void onVisible() {
//尚未初始化,返回去做初始化
if (!isPrepared){
return;
}
//只有在第一加载时才加载数据
if (!isFirstLoaded){
initData();
isFirstLoaded = true;
}
}
protected abstract void initData();
protected void initView(){}
//设置布局文件
protected abstract int setContent();
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
//页面销毁时重置
isPrepared = false;
isFirstLoaded = false;
isGankFirstLoad = false;
}
@Override
public void onDestroy() {
super.onDestroy();
if (compositeDisposable!=null&&compositeDisposable.size()>0){
compositeDisposable.clear();
}
}
}
一些说明,大家可能看到,我有一
//第一个默认的fragment是否加载
protected boolean isGankFirstLoad = false;
这个我是后来测试后加上去的,就是在默认第一个fragment加载的时候,无法显示数据
在默认的fragment中是这么写的
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
//此处第一次要额外调用一次数据加载,否则会没有数据
if (!isGankFirstLoad){
initData();
isGankFirstLoad = true;
}
}
这样就基本懒加载成功,,,good day