懒加载BaseFragment

作者: 颤抖的闪电 | 来源:发表于2018-08-31 16:39 被阅读75次
    public abstract class BaseFragment extends Fragment{
        protected boolean isViewInitiated = false;
        protected boolean isVisibleToUser = false;
        protected boolean isDataInitiated = false;
    
        View view;
    
        public BaseFragment() {
            super();
        }
    
        /**
         * @param isVisibleToUser 注意:setUserVisibleHint()方法是在onCreate()方法、
         *                        甚至是onAttach()方法之前调用的,所以它里面不能有任何对Context上下文对象的调用!
         *                        getUserVisibleHint()返回的变量,是App提供的代表此Fragment当前对于用户是否可见的一个布尔值;
         *                        <p>
         *                        setUserVisibleHint()在Fragment创建时会先被调用一次,传入isVisibleToUser = false
         *                        如果当前Fragment可见,那么setUserVisibleHint()会再次被调用一次,传入isVisibleToUser = true
         *                        如果Fragment从可见->不可见,那么setUserVisibleHint()也会被调用,传入isVisibleToUser = false
         *                        总结:setUserVisibleHint()除了Fragment的可见状态发生变化时会被回调外,在new Fragment()时也会被回调
         *                        如果我们需要在 Fragment 可见与不可见时干点事,用这个的话就会有多余的回调了,那么就需要重新封装一个
         */
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            this.isVisibleToUser = isVisibleToUser;
            prepareFetchData(false);//false:获取数据一次;true:每次可见时都会强制获取数据
            prepareDoSomeThing();
        }
    
    
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
    
            isViewInitiated = true;
    
            //防止事件穿透
            view.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    return true;
                }
            });
    
            prepareFetchData(false);
            prepareDoSomeThing();
    
        }
    
    
        public abstract void fetchData();//获取数据,执行一次
        public abstract void doItEvery();//每次进入页面可见时都会执行
    
        public boolean prepareFetchData(boolean forceUpdate) {
            if (isVisibleToUser && isViewInitiated && (!isDataInitiated || forceUpdate)) {
                fetchData();
                isDataInitiated = true;
                return true;
            }
            return false;
        }
    
        public boolean prepareDoSomeThing() {
            if (isVisibleToUser && isViewInitiated) {
                doItEvery();
                return true;
            }
            return false;
        }
    
    }
    

    感谢:
    ViewPager+Fragment LazyLoad最优解

    相关文章

      网友评论

        本文标题:懒加载BaseFragment

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