fragment 的懒加载

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);
}

当需要使用懒加载时继承该基类就可以了,并实现抽象方法。具体的例子我就不发了,比较简单,有问题可以留言。

发布了12 篇原创文章 · 获赞 6 · 访问量 931

猜你喜欢

转载自blog.csdn.net/qq_30867605/article/details/87810462
今日推荐