美文网首页Android知识Android开发Android技术知识
Fragment与ViewPager结合使用,实现数据懒加载

Fragment与ViewPager结合使用,实现数据懒加载

作者: Serenity那年 | 来源:发表于2016-12-06 11:12 被阅读395次

    一、使用说明

    这两天项目中遇到了fragment和Viewpager预加载的问题,为了节约请求资源,查到fragment的此种用法,大神请绕道了
    准备开车...
    当项目用到Fragment 与 ViewPager时,由于ViewPager的底层会预加载一个页面(设置setOffscreenPageLimit(0)方法无效,源码默认为1,设置0无效,可以查看该方法源码知道),导致不可见的页面进行加载了数据(执行了Fragment的onCreateView()中的逻辑),可能会导致数据请求浪费(如果项目需要预加载,算我没说哈),此时就需要做特殊处理,需要用到Fragem问题提供的API进行处理即可;

    二、具体实现

    只需要继承LazyFragment即可,具体抽象方法的作用,请看注释,十分简单;

    package com.custom.lazyfragment;
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    /**
     * Created by WangLu on 2016/12/5.
     * E-mail:wang_lu90125@163.com
     */
    
    public abstract class LazyFragment extends Fragment {
        //判断当前Fragment是否成功请求回数据,用来控制当前fragment可见时是否刷新数据
        protected boolean isLoadDataSuccess ;
        //当前的Fragment是否初始化完成
        protected boolean isInitialized ;
    
        private View view ;
    
    
    
        /**
         * 此方法在onCreateView()方法加载前执行,用来进行其他小量的初始化操作(比如初始化需要通过AIDL调用的远程服务)
         * @param isVisibleToUser
         */
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            //在此方法中做fragment是否初始化完毕判断,防止出现NullPointException
            initDatas();
        }
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            view = inflater.inflate(getLayoutID(), container, false);
            isInitialized = true ;
            iniView(view);
            initDatas();
            return view;
        }
    
    
        private void initDatas() {
    
            //如果初始化未完成,直接return
            if(!isInitialized){
                return ;
            }
    
            //初始化完成 但不可见
            if (!getUserVisibleHint()) {
                //预加载的和将要不可见的 会走此方法
                //每次切换都会走此方法
                initializeSuccessButInvisible();
            }else{//初始化完成 并可见
                //lazyLoad 数据
                if (isLoadDataSuccess) {//上次加载数据成功,以后做一些处理的逻辑(比如刷新数据)
                    refreshDataSources();
                }else{
                    //加载数据
                    lazyLoad();
                    isLoadDataSuccess = true ;
                }
    
            }
        }
    
    
        /**
         * 优化抽取findViewById
         * @param resourcesId
         * @param <T>
         * @return
         */
        protected <T extends View> T getView(@Nullable int resourcesId){
            return (T) view.findViewById(resourcesId);
        }
    
        /**
         * reset all state
         */
        @Override
        public void onDestroyView() {
            super.onDestroyView();
            isInitialized = false ;
            isLoadDataSuccess = false ;
        }
    
        /**
         * 刷新数据的方法
         * 空实现
         * 如果需要刷新数据 需要重写
         */
        protected void refreshDataSources() {
        }
    
        protected abstract int getLayoutID();
    
        protected abstract void iniView(View view);
    
        protected abstract void initializeSuccessButInvisible();
    
        protected abstract  void lazyLoad();
    }
    

    三、github仓库

    初步封装下,如有不足,请各位大神留下宝贵意见,小弟十分感谢,谢谢!

    相关文章

      网友评论

        本文标题:Fragment与ViewPager结合使用,实现数据懒加载

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