美文网首页有用优秀案例Android
Fragment懒加载实现,BaseFragment封装

Fragment懒加载实现,BaseFragment封装

作者: 打酱油的日光灯 | 来源:发表于2019-03-15 18:00 被阅读1017次

    抓住人生中的一分一秒,胜过虚度中的一月一年!

    前言

    在实际开发中,fragment使用经常会结合viewpager一起使用,页面可能会由三个或更多Fragment构成,每个fragment可能都是由复杂的布局结构所组成,这个时候直接加载出来,或是默认加载两三个都是有点耗费资源的,可能还会比较卡顿,所以懒加载这一名词就会提上议程

    对于懒加载,通俗点讲就是看不见的不需要的不加载,当需要时再进行加载,让体验(页面绘制),流量等更节省

    思路(其实很简单,思路明确了很好理解)

    fragment中有一个setUserVisibleHint函数,此函数含义为 “当fragment被用户可见时,setUserVisibleHint()会调用且传入true值,当fragment不被用户可见时,setUserVisibleHint()则得到false值。”

    了解了这个函数之后,稍微封装一下不就实现了懒加载了吗?

    实现目标

    1、布局初始化后,才能加载数据
    2、界面是否可见后,才能加载数据
    3、是否加载过数据,如果加载过,就不重复加载
    4、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)

    实现步骤

    1、布局初始化后进行加载数据

    /**
         * 是否初始化过布局
         */
        protected boolean isViewInitiated;
    
      @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            isViewInitiated=true;
            //加载数据方法
            prepareFetchData();
        }
    

    2、界面可见了加载数据

      /**
         * 当前界面是否可见
         */
        protected boolean isVisibleToUser;
    
    @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            this.isVisibleToUser = isVisibleToUser;
            if (isVisibleToUser) {
                prepareFetchData();
            }
        }
    

    3、定义个常量,可以强制性加载数据,可以手动控制(不过没啥用)

      public void prepareFetchData() {
            prepareFetchData(false);
        }
    
    

    4、加载过数据,就不重复加载

     /**
         * 是否加载过数据
         */
     protected boolean isDataInitiated;
    
     public void prepareFetchData(boolean forceUpdate) {
            if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
                loadData();
                isDataInitiated = true;//不再重复加载
            }
        }
    

    5、加载数据

     /**
         * 判断懒加载条件
         *
         * @param forceUpdate 强制更新,没啥用
         */
        public void prepareFetchData(boolean forceUpdate) {
            if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
                loadData();
                isDataInitiated = true;
            }
        }
      /**
         * 懒加载
         */
        protected abstract void loadData();
    

    下面介绍下子类Fragment如何使用

    
    public class TextFragment extends BaseFragment{
        @Override
        protected BasePresenter createPresenter() {
            return null;
        }
    
        @Override
        protected int getLayoutId() {
            return R.layout.fragment_base;
        }
    
        @Override
        protected void initData() {
    
        }
    
        @Override
        protected void loadData() {
            //加载数据
        }
    }
    

    全部BaseFragment代码如下

    /**
     * File descripition:
     *
     * @author lp
     * @date 2019/3/15
     */
    
    public abstract class BaseFragment extends Fragment {
        public View view;
    
        public Activity mContext;
    
        /**
         * 是否初始化过布局
         */
        protected boolean isViewInitiated;
        /**
         * 当前界面是否可见
         */
        protected boolean isVisibleToUser;
        /**
         * 是否加载过数据
         */
        protected boolean isDataInitiated;
    
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            view = inflater.inflate(getLayoutId(), container, false);
            ButterKnife.bind(this, view);
            mContext = getActivity();
    
            this.initData();
            return view;
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            isViewInitiated=true;
            //加载数据
            prepareFetchData();
        }
    
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            this.isVisibleToUser = isVisibleToUser;
            if (isVisibleToUser) {
                prepareFetchData();
            }
        }
    
        public void prepareFetchData() {
            prepareFetchData(false);
        }
    
        /**
         * 判断懒加载条件
         *
         * @param forceUpdate 强制更新,好像没什么用?
         */
        public void prepareFetchData(boolean forceUpdate) {
            if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
                loadData();
                isDataInitiated = true;
            }
        }
    
        /**
         * 懒加载
         */
        protected abstract void loadData();
    
        /**
         * 获取布局ID
         *
         * @return
         */
        protected abstract int getLayoutId();
    
        /**
         * 数据初始化操作
         */
        protected abstract void initData();
    
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            this.view = null;
        }
    
        @Override
        public void onDestroyView() {
            super.onDestroyView();
            ButterKnife.bind(getActivity()).unbind();
        }
    
        /**
         * [页面跳转]
         *
         * @param clz
         */
        public void startActivity(Class<?> clz) {
            startActivity(clz, null);
        }
    
    
        /**
         * [携带数据的页面跳转]
         *
         * @param clz
         * @param bundle
         */
        public void startActivity(Class<?> clz, Bundle bundle) {
            Intent intent = new Intent();
            intent.setClass(getActivity(), clz);
            if (bundle != null) {
                intent.putExtras(bundle);
            }
            startActivity(intent);
        }
    
    
        /**
         * [含有Bundle通过Class打开编辑界面]
         *
         * @param cls
         * @param bundle
         * @param requestCode
         */
        public void startActivityForResult(Class<?> cls, Bundle bundle,
                                           int requestCode) {
            Intent intent = new Intent();
            intent.setClass(getActivity(), cls);
            if (bundle != null) {
                intent.putExtras(bundle);
            }
            startActivityForResult(intent, requestCode);
        }
    }
    

    最后,祝大家创作愉快

    相关文章

      网友评论

        本文标题:Fragment懒加载实现,BaseFragment封装

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