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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iOS - UIImageView
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImageView : UIView @available(iOS 2.0, *) public class UIImageView : UIView 需要注意的是,Apple 对 png 格式图片支持最为良好的,对于其他格式支持相对较弱,当图片是 png 格式,那么图片名的后缀 .png 可以不写,但是如果图像只有 @2x 图片,没有一倍图像,则不能忽略 .png,在 iPhone4 以后,苹果采用视网膜屏幕,所以就有了 2 倍像素图像,随着发展现在有了 @3x 图,如果你现在还在用 Xcode5.1 写程序,在适配 iPhone6 以及 6+ 会自动放大即可,但是在 Xcode6 上就需要考虑适配问题,不会自动适配了。 如果不是 png 格式,请务必要加入后缀名,否则可能无法显示。比如目前无法直接加载 gif 图。 1、UIImageView 的创建 Objective-C 先设置 frame 后添加 image // 创建一个图片视图,只有图片 image 是显示不出来的,需要 image 放...
- 下一篇
Android安全开发之通用签名风险
Android安全开发之通用签名风险 作者:伊樵、舟海、呆狐@阿里聚安全 1 通用签名风险简介 1.1 Android应用签名机制 阿里聚安全漏洞扫描器有一项检测服务是检测APP的通用签名风险。Android系统要求安装的应用必须用数字证书进行签名后才能安装,并且签名证书的私钥由应用开发者保存。签名证书的生成也由开发者自己生成。在应用安装时会校验包名(package name)和签名,如果系统中已经存在了一个相同的包名和签名的应用,将会用新安装的应用替换旧的;如果包名相同但是签名不同,则会安装失败。 为什么需要数字签名? 数字签名是防止要保护的内容被篡改,用非对称加密算法。先对要保护的内容进行消息摘要,用私钥对消息摘要进行加密,生成数字签名,将数字签名和要保护的内容一起分发出去。内容接收者用公钥对数字签名解密得到发送者给的消息摘要A,内容接收者对接收到的内容进行用相同的消息摘要算法处理得到消息摘要B,对比A和B是否相同,来判定传送的内容是否被篡改。正常的APK文件是个ZIP压缩文件,除了应用的可执行文件、资源文件,还包括这些可执行文件、资源文件的摘要信息,数字证书的公钥信息等。并且通过...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS关闭SELinux安全模块
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7,CentOS8安装Elasticsearch6.8.6
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长