viewPage+fragment在开发中结合使用得非常多,viewPage为了页面滑动流畅,会进行预加载前后两页的fragment,这对与开发者而言有好有坏,好处开发者省事,坏处预加载可能会导致启动缓慢浪费流量等等,那么问题就来了,我们不想预加载的时候要怎么办呢,下面就来介绍一下懒加载。
先来看看fragment中的一个方法
public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); }
该方法在fragment显示跟隐藏时调用,显示时参数为true,隐藏时参数为false。但是每次在fragment实例化会先调用一次参数为false,然后在显示时又调用一次并且参数true,该方法在onViewCreated方法之前执行。
有了上面的方法懒加载是不是变得很简单,确实,我们都可以轻松的实现。但是大家的需求都是不一样的,下面就介绍一种需求情况,需求:
每次当fragment显示时加载一次数据,重复切换不重新加载,并且在fragment 可见跟不可见的过程中做一些UI操作。
为什么不再setUserVisibleHint方法中执行该操作,因为该方法在创建实例时就会调用,可能会导致UI控件空指针错误,如果多个地方需要使用懒加载,重复判断也不是我们的风格,我们可以将其封装在基类。
public abstract class BaseFragment extends Fragment{ private boolean isFirstVisible; private View rootView; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); isFirstVisible = true; } @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); if(rootView == null){ rootView = view; if(getUserVisibleHint() && isFirstVisible){ onLazyData(); isFirstVisible = false; onChangeVisible(true); } } } @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if(rootView == null){ return; } if(isVisibleToUser && isFirstVisible){ onLazyData(); isFirstVisible = false; } if(isVisibleToUser){ onChangeVisible(true); }else { onChangeVisible(false); } } /** * 懒加载数据,不能做更新UI操作 */ protected abstract void onLazyData(); /** *fragment状态切换时会调用该方法,可以执行UI操作 * @param isVisble 为true 显示 */ protected abstract void onChangeVisible(boolean isVisble); }
当需要使用懒加载时继承该基类就可以了,并实现抽象方法。具体的例子我就不发了,比较简单,有问题可以留言。