android小技巧之不缓存的ViewPager

前言

在开发中我们会经常用到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

android小技巧之不缓存的ViewPager
AndroidRookie
上一篇:微信支付服务商下特约商户申请流程详解


下一篇:PLSQL Developer图形化窗口创建数据库全过程