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

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

作者: 林锦洲 | 来源:发表于2019-03-18 18:00 被阅读0次

    前言

    用过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懒加载,简单解决页面切换数据重新加载问题

          本文链接:https://www.haomeiwen.com/subject/joebmqtx.html