美文网首页功能专区Android开发经验谈Android开发
Fragment懒加载(四) 与 EditText在PopupW

Fragment懒加载(四) 与 EditText在PopupW

作者: 键盘上的麒麟臂 | 来源:发表于2018-03-26 10:11 被阅读88次

    这篇讲两个内容,因为感觉内容都太少了,所以就合起来写一篇算了。

    一.Fragment懒加载(四)对Fragment的封装

    我之前写过一篇文章说过要实现Fragment的懒加载,要定义3个参数,如果进行懒更新的话还要加一个参数,所以想想如果你的每个fragment都要定义4个参数,至少我觉得这样的代码扩展性不是很好,所以我就写了个LazyFragment对懒加载的操作进行封装。

    顺便一提我对“懒”的使用:
    我在项目中大量的使用了懒加载和懒更新,可以说我觉得这个思想非常的爽,我这边项目就我这个端做了懒加载,比如你有一个viewpager有3个fragment,其它端的操作是如果更新的话,这3个页面都要重新请求一次数据,而我这边用了懒更新后,我可以实现两个功能,一是只在切换页面后才进行数据重写加载,二是我可以很方便的选择只有某个Fragment进行懒更新,那就非常的爽啊。

    话不多说,直接上代码,只要继承你原本写的Fragment基类,然后让其它类继承LazyFragment就行

    public abstract class LazyFragment extends BaseFragment{
    
        //定义3个布尔值来做懒加载的判断
        private boolean isFristShowFragment = true;
        private boolean isVisibleToUser;
        private boolean isInitView = false;  // 是否执行过initview
        //懒加载
        private boolean isNeedDelayedRequestAgain = false;
        /**
         *  防止ViewPager预加载而设置懒加载,该方法调用在onCreate前
         */
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            this.isVisibleToUser = isVisibleToUser;
            if (isVisibleToUser && isFristShowFragment && isInitView){
                initView(rootView);
                return;
            }
            // 判断是否进行延迟更新
            if (isNeedDelayedRequestAgain && isVisibleToUser && !isFristShowFragment){
                isNeedDelayedRequestAgain = false;
                replaceSetData();
            }
        }
    
        @Override
        protected void initView(View view) {
            isInitView = true;
            // 显示并且第一次展示这个页面才进入判断
            if (isVisibleToUser && isFristShowFragment){
                isNeedDelayedRequestAgain = false;// 防止重复加载
                isFristShowFragment = false;
                fristInitView(rootView);
                fristToData();
            }
        }
    
        // 第一次初始化
        protected abstract void fristInitView(View rootView);
        // 第一次获取数据
        protected abstract void fristToData();
        // 懒加载时重新获取数据
        public void replaceSetData(){
    
        }
    
    
        @Override
        protected void setDataToView() {
    
        }
    
        public void setNeedDelayedRequestAgain(boolean needDelayedRequestAgain) {
            isNeedDelayedRequestAgain = needDelayedRequestAgain;
        }
    }
    

    代码很简单,流程上的懒加载是封装好的,然后如果要使用懒更新功能的话。要在具体的fragment中重写replaceSetData()方法,在里面写上你的请求网络的操作就行。然后调用setNeedDelayedRequestAgain()就能传入是否进行懒更新。

    二.EditText在Popupwindow中的BUG

    我之前的弹框都是封装Popupwindow来使用的,自己封装后确实使用得非常方便,可谁知道竟然会出现了细微的BUG,这让我心疼不已,其实我很不明白为什么谷歌对弹框要推出这么多个实现方法,也许是我太菜了,无法理解谷歌的良苦用心。

    回头说说这个BUG,就是在Popupwindow使用EditText的时候,无法实现长按复制粘贴功能,这个功能叫做selection markers。
    我感觉我之前白封装了,在网上查阅了大量的资料包括stackoverflow,都只说了一句话,没救了,用DialogFragment代替。

    以后写弹框用DialogFragment
    以后写弹框用DialogFragment
    以后写弹框用DialogFragment
    重要的事说三遍。

    相关文章

      网友评论

        本文标题:Fragment懒加载(四) 与 EditText在PopupW

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