android小技巧之不缓存的ViewPager

简介: 前言在开发中我们会经常用到ViewPager这个类,比如引导页的啦,主页啦,等等之类的。一般情况下,我在ViewPger中都是放的Framgnt,这样简单有方便,但是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
目录
相关文章
|
5月前
|
存储 缓存 Android开发
安卓Jetpack Compose+Kotlin, 使用ExoPlayer播放多个【远程url】音频,搭配Okhttp库进行下载和缓存,播放完随机播放下一首
这是一个Kotlin项目,使用Jetpack Compose和ExoPlayer框架开发Android应用,功能是播放远程URL音频列表。应用会检查本地缓存,如果文件存在且大小与远程文件一致则使用缓存,否则下载文件并播放。播放完成后或遇到异常,会随机播放下一首音频,并在播放前随机设置播放速度(0.9到1.2倍速)。代码包括ViewModel,负责音频管理和播放逻辑,以及UI层,包含播放和停止按钮。
|
6月前
|
安全 Android开发 开发者
【Android开发小技巧】扔掉这坑人的 Handler
【Android开发小技巧】扔掉这坑人的 Handler
75 0
|
Android开发
Android 使用ViewPager实现手动左右切换页面和底部点点跟随切换效果
Android 使用ViewPager实现手动左右切换页面和底部点点跟随切换效果
191 0
|
6月前
|
XML Java Android开发
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
887 0
|
3月前
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
41 2
|
25天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
49 15
Android 系统缓存扫描与清理方法分析
|
5月前
|
Android开发 容器
35. 【Android教程】视频页面:ViewPager
35. 【Android教程】视频页面:ViewPager
60 3
|
2月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
70 8
|
3月前
|
Android开发
Android使用ViewPager做无限轮播,人为滑动时停止
Android使用ViewPager做无限轮播,人为滑动时停止
77 2
|
4月前
|
缓存 编解码 安全
Android经典面试题之Glide的缓存大揭秘
Glide缓存机制包括内存和硬盘缓存。内存缓存使用弱引用的ActiveResources和LRU策略,硬盘缓存利用DiskLruCache。Engine.load方法首先尝试从内存和弱引用池加载,然后从LRU缓存中加载图片,增加引用计数并移出LRU。若缓存未命中,启动新任务或加入现有任务。内存大小根据设备内存动态计算,限制在0.4以下。DiskLruCache使用自定义读写锁,保证并发安全,写操作通过锁池管理,确保高效。
121 0
下一篇
无影云桌面