美文网首页android自定义view
ViewPager懒加载的那些事

ViewPager懒加载的那些事

作者: 笔墨Android | 来源:发表于2017-09-14 21:59 被阅读109次

    不怕跌倒,所以飞翔

    今天在公司写项目的时候用到了Fragment的懒加载,发现懒加载的细节还有些不理解的,所以准备写一篇文章记录一下今天用到项目中用到的内容总结一下:

    关于ViewPager懒加载,必须要先说说ViewPager的加载方法:

    ViewPager预加载机制

    在Android中我们经常会用到ViewPager+Fragment组合。然而,有一个很让人头疼的问题就是,我们去加载数据的时候由于ViewPager的内部机制所限制,所以它会默认至少预加载一个。这让人很郁闷,所以,我就想到要封装一个Fragment来解决这个问题。

    关于懒加载主要的两个方法就是

    void setUserVisibleHint(boolean isVisibleToUser);//代表Fragment可见的时候回调的方法
    boolean getUserVisibleHint();//获取当前Fragment是否可见的方法
    

    通过上面两个方法对数据的加载进行判断,从而达到懒加载的目的。

    具体的实现方案就是,在页面可见的时候(也就是setUserVisibleHint()回调的时候对数据进行判断,是否加载数据,其实这个时候控件已经加载出来了,只是数据没有进行请求和加载)加载数据。

    public abstract class BaseFragment extends Fragment {
    
        public Context mContext;
        protected boolean isVisible = false;/*是否可见*/
        protected boolean isPrepared = false;/*是否已经准备好*/
        protected boolean isFirst = true;/*是否第一次加载*/
    
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if (getUserVisibleHint()) {
                isVisible = true;
                lazyLoad();
            } else {
                isVisible = false;
                onInvisible();
            }
        }
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mContext = getContext();
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(createViewLayoutId(), container, false);
        }
    
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            isPrepared = true;/*数据已经准备好了*/
            initPrepare();
        }
    
        /**
         * 设置资源ID的方法
         *
         * @return 返回相应的资源ID
         */
        public abstract int createViewLayoutId();
    
        /**
         * 是否已经准备好数据
         */
        protected abstract void initPrepare();
    
        /**
         * 不可见的时候调用,也就是每次页面不可见的时候都会调用这个方法
         */
        protected abstract void onInvisible();
    
        protected void lazyLoad() {
            /*这里isFirst可以根据实际情况去判断这个是否需要,是否需要每次进到这个页面需要刷新*/
            if (!isPrepared || !isVisible /*|| !isFirst*/) {
                return;
            }
            initData();
    //        isFirst = false;
        }
    
        /**
         * 这里获取数据,刷新界面
         */
        protected abstract void initData();
    }
    

    上面这个主要是实现懒加载的Fragment,这里主要看setUserVisibleHint(boolean isVisibleToUser)这个方法,这里面主要是判断当页面显示的时候设为可见,并且进入lazyLoad()这里如果要是已经准备好的话,就可以加载数据了,如果没有准备好就不去加载数据!这里面的注释写的很清楚了,仔细回味一下就好了,其实主要是理解上面那那个方法的话就好了。。。

    相关文章

      网友评论

        本文标题:ViewPager懒加载的那些事

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