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

img_b246dc41a34e6fdd3598d113e0f65194.jpe
AndroidRookie
优秀的个人博客,低调大师

微信关注我们

原文链接:https://yq.aliyun.com/articles/641072

转载内容版权归作者及来源网站所有!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Java Development Kit(Java开发工具)

Java Development Kit(Java开发工具)

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。

Sublime Text 一个代码编辑器

Sublime Text 一个代码编辑器

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。