ViewPager + Fragment 实现懒加载

作者: 文艺的程序狗 | 来源:发表于2017-09-01 17:57 被阅读211次

    前言

    关键字

    懒加载 setUserVisibleHint BaseFragment

    废话

    懒加载已可以称延迟加载。在ViewPager + Fragment 实现左右切换的页面默认会默认加载当前Fragment相邻的Fragment数据,为了更好的用户体验,最好是切换到当前Fragment再加载数据,避免了加载对性能的损耗同时也节省了用户的流量。

    我们发现ViewPager的setOffsetPageLimit(n)可以设置缓存页面,当前页面相邻的n个页面都会被缓存。话讲到这个份上,蓦然发现,“握草!”,不是直接把n设置为0不就行了麽,缓存页面为0,so easy!好了,解析完毕,下班回家收衣服!

    当然肯定没有那么简单,不然就没必要在这里BB了

    No BB , Show me the Code

    public abstract class BaseFragment extends Fragment{
    
        private BaseActivity mActivity;
        private View mRootView; //缓存Fragment view
        private boolean mIsLoad = false;//是否加载数据
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.mActivity = (BaseActivity) getActivity();
        }
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            if (mRootView == null) {
                mRootView = inflater.inflate(attachLayoutRes(), null);
             mRootView.findViewById(R.id.empty_layout);
                initViews(mRootView, savedInstanceState);
            }
    
    
            ViewGroup parent = (ViewGroup) mRootView.getParent();
            if (parent != null){
                parent.removeView(mRootView);
            }
    
            return mRootView;
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            if (getUserVisibleHint()  && mRootView != null && !mIsMulti) {
                mIsLoad = true;
                updateViews(true);
            }
        }
    
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
    
            if (isVisibleToUser && isVisible() && mRootView != null && !mIsLoad){
                mIsLoad = true;
                updateViews(true);
            }else {
                super.setUserVisibleHint(isVisibleToUser);
            }
        }
    
        /**
         * 更新布局 在这里加载数据
         * @param isShowLoading 是否显示加载中的布局
         */
        protected abstract void updateViews(boolean isShowLoading);
    
        /**
         * 加载布局
         * @return
         */
        public abstract int attachLayoutRes();
    
        /**
         * 初始化布局
         * @param view
         * @param savedInstanceState
         */
        public abstract void initViews(View view, Bundle savedInstanceState);
       
    

    想直接使用的朋友可以让Fragment继承该类就行了

    这里我就不通过打印的Log来说明,直接通过问答的方式简单介绍一下

    • setUserVisibleHint方法调用时机

    当Fragment可见状态发生变化的时候调用,在这里可以进行相应可见时进行相应的逻辑处理

    • 为什么在setUserVisibleHint加个mRootView判空处理

    Fragment调用顺序 setUserVisibleHint——>onCreateView——>onActivityCreated(注意setUserVisibleHint调用是在onCreateView之后)

    • 为什么要在setUserVisibleHint方法和onActivityCreated两处都调用获取数据进行界面更新的方法updateViews呢?

    这里我直接给出表象,自己思考一下就知道为什么了:第一次进入界面,第一个Fragment获取数据是在onActivityCreated里面,剩余的Fragment获取数据是在setUserVisibleHint里面。

    END

    就结束了?怎么会呢,文章还没有图呢,以一张帅气的哈士奇结束,祝大家周末愉快

    王之藐视

    相关文章

      网友评论

        本文标题:ViewPager + Fragment 实现懒加载

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