Fragment懒加载失效,多次加载数据

ViewPager和Fragment一起使用时,为了防止一进入Activity就加载所有Fragment的数据,减轻Activity初始化加载的负担,需要用懒加载的方式去加载Fragment,懒加载的方法如下:

让Fragment继承BaseFragment,BaseFragment代码如下所示:

    /**
     * 应用程序的基类Fragment,实现懒加载
     * Created by Jack on 2016/5/17 08:31.
     * Email: [email protected]
     */
    public abstract class BaseFragment extends Fragment {
        protected boolean isVisible;
    
        protected Dialog mDialog;
    
        /**
         * 在这里实现Fragment数据的懒加载
         *
         * @param isVisibleToUser Fragment UI对用户是否可见
         */
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if (getUserVisibleHint()) {
                isVisible = true;
                onVisible();
            } else {
                isVisible = false;
                onInvisible();
            }
        }
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle
                savedInstanceState) {
            View view = inflater.inflate(getContentView(), container, false);
            initView(view);
            mDialog = DialogUtil.createLoadingDialog(getActivity(), "正在加载数据中......");
            return view;
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            lazyLoad();
        }
    
        protected void onVisible() {
            lazyLoad();
        }
    
        protected void onInvisible() {
        }
    
        protected abstract void lazyLoad();
    
        protected abstract int getContentView();
    
        protected abstract void initView(View view);
    }

子Fragment代码如下:

    public class LogisticsFragment extends BaseFragment{
        private boolean isPrepared;
        
        @Override
        protected void lazyLoad() {
            if (isPrepared && isVisible) {
                //做加载数据的网络操作
                isPrepared = false;
            }
        }
        @Override
        protected void initView(View view) {
            //做初始化View的操作
            isPrepared = true;
        }
    }

但是现在由于ViewPager和Fragment一起用,由于ViewPager默认只能缓存Fragment左右两边各一个Fragment,也就是说缓存值是1,设置缓存页面的方法如下:

mViewpager.setOffscreenPageLimit(2);

如果未调用上面的设置缓存页面的方法,默认缓存值就是1,此时如果你的Fragment页在3个及以上时,当你切换Fragment时,就会造成未缓存的Fragment会执行onDestroyView,然而再次切换到这个未缓存的Fragment或者切换到与这个未缓存的Fragment相邻的Fragment时,他就会再次执行onCreateView方法,也就是说再次initView,这样isPrepared又会被置为true,因此导致lazyLoad方法里的判断加载数据的表达式为true,加载数据就会再次执行了。

这里懒加载并不是说让lazyLoad方法只执行一次,而是通过判断让加载数据只执行一次。

ViewPager的设置缓存页面的方法具体细节可以翻阅官方文档:setOffscreenPageLimit

参考链接:ViewPager中切换界面Fragment被销毁的问题分析

你可能感兴趣的:(Fragment懒加载失效,多次加载数据)