美文网首页需要练习,未看Android开发
android小技巧之不缓存的ViewPager

android小技巧之不缓存的ViewPager

作者: AndroidRookie | 来源:发表于2016-08-09 09:28 被阅读1112次

    前言

    在开发中我们会经常用到ViewPager这个类,比如引导页的啦,主页啦,等等之类的。

    一般情况下,我在ViewPger中都是放的Framgnt,这样简单有方便,但是ViewPager却会默认的缓存当前页面的最近两个页面,于是问题就产生了,我们的需求是只有切换到哪页,哪页才创建或者加载布局,但是谷歌官方的ViewPager却没有自带这个选项,就算我们用setOffscreenPageLimit(0)也不能解决这个问题:

         private static final int DEFAULT_OFFSCREEN_PAGES = 1;
    
         public void setOffscreenPageLimit(int limit) {
            if (limit < DEFAULT_OFFSCREEN_PAGES) {
                    Log.w(TAG, "Requested offscreen page limit " + limit + " too small; defaulting to " +
                        DEFAULT_OFFSCREEN_PAGES);
                limit = DEFAULT_OFFSCREEN_PAGES;
            }
            if (limit != mOffscreenPageLimit) {
                mOffscreenPageLimit = limit;
                populate();
            }
        }
    

    从上面的代码可以看到,就算设置0、负数,它也会默认为1,为了解决这个问题,有两个方法:
    第一种:重写整个ViewPager
    第二种:使用Fragment的setUserVisibleHint方法(相当于Activity中的onResume方法)

    第一种方法

    重写整个ViewPager,下面直接上代码,需要的直接拷贝过去就好 没有什么技术含量,一般情况下我用的都是第二种方法。

    代码篇幅过长,请直接到仓库复制吧!

    设置setOffscreenPageLimit(0),ViewPager就不会缓存了,PS:无法和ToolBar一起使用,

    第二种方式

    使用Fragment的setUserVisibleHint方法(相当于Activity中的onResume方法)

    
        public class HomeFragment extends Fragment {
    
        private View contentView;
    
        /**
         * 是否创建
         */
        protected boolean isCreate = false; 
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            contentView = inflater.inflate(R.layout.fragment_home, container, false);
            return contentView;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            isCreate=true;
        }
        @Override
        public void setUserVisibleHint(boolean isVisibleToUser) {
            super.setUserVisibleHint(isVisibleToUser);
            if (isVisibleToUser && isCreate) {
                //相当于Fragment的onResume
                //在这里处理加载数据等操作
            } else {
                //相当于Fragment的onPause
            }
        }
        
      
    
    

    其它

    如果不希望切换ViewPager的时候每次都重新创建Fragment的话,也很简单只需要将适配器的两个方法注释掉就好:

    
                 @Override
                public void destroyItem(ViewGroup container, int position, Object object) {
                    //super.destroyItem(container, position, object);
                }
    
                @Override
                public void destroyItem(View container, int position, Object object) {
                    //super.destroyItem(container, position, object);
                  
                }
                //不让他们调用父类方法就不会销毁Fagment了
    
    
    最后

    附上自己git

    https://github.com/aohanyao/NoCacheViewPager

    来来扫下码,关注一下吧,或者微信搜索AndroidRookie

    AndroidRookie

    相关文章

      网友评论

      本文标题:android小技巧之不缓存的ViewPager

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