Fragment懒加载,简单解决页面切换数据重新加载问题

前言

用过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(){
        // 加载数据
    }
}

你可能感兴趣的:(Fragment懒加载,简单解决页面切换数据重新加载问题)