ViewPager的缓存机制
1.实现Viewpager的页面懒加载:
在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容。
2.可控Viewpager缓存页面的数量:
常见的情况:
(1)页面的总数是已知的,或者可以计算出来,每个页面占用的资源并不多并且需要经常使用这些页面。这时可以考虑将其常驻ViewPager而不去销毁(频繁的销毁和重建也会消耗比较多的资源)。
(2)切换页面时默认情况下非相邻的页面会被销毁掉(ViewPager默认缓存或预加载相邻的页面以便快速切换),如果想要保持页面之前的状态,如滚动条滚动位置等比较困难;这时可以考虑将之前的页面缓存下来而不销毁掉。
ViewPager的默认加载与缓存模式
ViewPager和ListView、GridView等的数据加载方式类似,控件本身都提供了数据加载的适配器接口,程序员只需实现特定的Adapter就可以轻松的将数据填充到容器中。
我们来看一个简单的Demo。
1.ViewPager懒加载和缓存测试类
public class MainActivity extends Activity { private static final String TAG = "com.example.viewpagertest.MainActivity"; private MyViewPager viewPager; private List<View> pagers = new ArrayList<View>(); /** ViewPager缓存页面数目;当前页面的相邻N各页面都会被缓存 */ private int cachePagers = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getViews(); setContentView(viewPager); setListener(); setAdapter(); } private void getViews() { viewPager = new MyViewPager(this); for (int i = 0; i < 5; i++) { TextView textView = new TextView(this); pagers.add(textView); viewPager.onDisplay(i);//测试1 } viewPager.setOffscreenPageLimit(cachePagers);// 设置缓存页面,当前页面的相邻N各页面都会被缓存 } private void setAdapter() { viewPager.setAdapter(pagerAdapter); } private void setListener() { viewPager.setOnPageChangeListener(pageChangeListener); } /** * 页面数据适配器 */ private PagerAdapter pagerAdapter = new PagerAdapter() { @Override public void destroyItem(View container, int position, Object object) { Log.i(TAG, "destroyItem:" + position); ((ViewGroup) container).removeView((View) object); } @Override public void destroyItem(ViewGroup container, int position, Object object) { Log.i(TAG, "destroyItem:" + position); container.removeView((View) object); } @Override public Object instantiateItem(View container, int position) { Log.i(TAG, "instantiateItem:" + position); try { ((ViewPager) container).addView(pagers.get(position)); // ((MyViewPager) container).onDisplay(position);//测试2 } catch (Exception e) { Log.e(TAG, e.getMessage()); } return pagers.get(position); } @Override public Object instantiateItem(ViewGroup container, int position) { Log.i(TAG, "instantiateItem:" + position); try { ((ViewPager) container).addView(pagers.get(position)); // ((MyViewPager) container).onDisplay(position);//测试2 } catch (Exception e) { Log.e(TAG, e.getMessage()); } return pagers.get(position); } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public int getCount() { return pagers.size(); } }; /** * 页面滚动监听器 */ private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { Log.i(TAG, "onPageSelected:" + arg0); // viewPager.onDisplay(arg0);//测试3 } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }; /** * @Title setPageData * @Description 加载页面数据 * @param position */ private void setPageData(int position) { TextView textView = (TextView) pagers.get(position); textView.setText("pager" + position); Log.i(TAG, "setPageData position:" + position); } class MyViewPager extends ViewPager implements IPagerDisplay { public MyViewPager(Context context) { super(context); } public MyViewPager(Context context, AttributeSet attrs) { super(context, attrs); } @Override public void onDisplay(int position) { setPageData(position); } } }
2.ViewPager数据展示回调接口
/** * @Title IPagerDisplay.java * @Package com.example.viewpagertest * @Description ViewPager数据展示回调 * @author ze.chen * @date 2013-5-13 下午2:25:38 * @version V1.0 */ package com.example.viewpagertest; /** * @ClassName IPagerDisplay * @Description ViewPager懒加载展接口;可以在PagerAdapter的instantiateItem时候调用, * 亦可以在OnPageChangeListener的onPageSelected时候调用 * ,两处的区别在于,instantiateItem方法ViewPager会自动缓冲 * (浏览pager1时将pager2的数据加载好), * 而onPageSelected则不会自动缓冲(浏览pager2时才加载pager2的数据) * @author ze.chen * @date 2013-5-13 下午2:25:38 * */ public interface IPagerDisplay { void onDisplay(int position); }
使ViewPager支持懒加载
在以上代码段中,分别注释了:测试1;测试2;测试3。
测试1:在加载ViewPager之前,初始化所有的页面和数据。
viewPager = new MyViewPager(this); for (int i = 0; i < 5; i++) { TextView textView = new TextView(this); pagers.add(textView); viewPager.onDisplay(i);//测试1 }
对于测试2和测试3,只将控件添加到pagers列表中,数据不立刻加载
测试2:在ViewPager的页面实例化的时候加载数据,预加载的时候也会执行该方法。
public Object instantiateItem(View container, int position) { Log.i(TAG, "instantiateItem:" + position); try { ((ViewPager) container).addView(pagers.get(position)); ((MyViewPager) container).onDisplay(position);//测试2 } catch (Exception e) { Log.e(TAG, e.getMessage()); } return pagers.get(position); }
测试3:当该页面被选中的时候才加载该页面的数据,预加载页面时不会加载预加载页的数据。
private OnPageChangeListener pageChangeListener = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { Log.i(TAG, "onPageSelected:" + arg0); viewPager.onDisplay(arg0);//测试3 } ……
修改ViewPager的缓存页面数量
viewPager.setOffscreenPageLimit(int numbers);
viewpager当前页面两侧缓存/预加载的页面数目。当页面切换时,当前页面相邻两侧的numbers页面不会被销毁。
ViewPager的缓存机制相关推荐
- recyclerview item点击无效_让你彻底掌握RecyclerView的缓存机制
点击上方蓝字关注 ?? 来源:肖邦kakahttps://www.jianshu.com/p/3e9aa4bdaefd 前言 RecyclerView这个控件几乎所有的Android开发者都使用过(甚 ...
- Android学习——ListView的缓存机制
在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间. ListView的使用 ListView和V ...
- RecyclerView详解一,使用及缓存机制
本文大致会先讲解RecyclerView的基础知识及使用,最后会深入讲解一点原理.当然,本人知识水平有限哈,太深入的东西我现在还没接触到,还请大家包容,阿里嘎多~ 一.RecyclerView的历史与 ...
- Django缓存机制
Django缓存机制三个粒度:1 全站缓存 settings.py 全局配置文件用中间件:MIDDLEWARE = [# 'django.middleware.cache.UpdateCacheMid ...
- MyBatis复习笔记6:MyBatis缓存机制
MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...
- java设置缓存机制
2019独角兽企业重金招聘Python工程师标准>>> java设置缓存机制 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实 ...
- Mybait缓存机制
MyBatis同大多数ORM框架一样,提供了一级缓存和二级缓存的支持. 一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空. 二级缓存:二级缓 ...
- LeetCode实战:LRU缓存机制
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Design and ...
- 微服务架构下静态数据通用缓存机制
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | my.oschina.net/u/3971241/bl ...
最新文章
- 团队-象棋游戏-模块测试过程
- 设计模式C++实现(10)——桥接模式
- Notepad++ 删除空白行的方法(转)
- ArcGIS中的WKID(转)
- 信用卡使用十年的心得体会(图)
- go struct结构
- 训练dnn_[预训练语言模型专题] MT-DNN(KD) : 预训练、多任务、知识蒸馏的结合
- 【爬虫剑谱】一卷3章 软件篇-Anaconda的安装及配置
- C++基础教程之重载运算符和重载函数
- 雅虎团队经验:网站页面性能优化的 34条
- app live photo_live photo动态壁纸下载-Live Photo动态壁纸app下载 苹果版v2.1-PC6苹果网...
- CMD文件的编写说明,比较详细的 1·什么是CMD文件,它有什么作用。
- 计算机专业读研期间的规划,计算机专业研究生的读研规划
- Android 谷歌拼音输入法最新发布
- 服务器带宽打开网页很慢,网速快但是打开网页慢是怎么回事 浏览器打开网页慢的解决办法汇总...
- threejs的转场动画 (基于Tween实现)、平滑切换场景
- 解决unable to find valid certification path to requested target
- 【Python教程】十四、找不到对象?用Python自己写一个|类与对象(二)
- 纷享销客百思特 | 数字化营销赋能企业新增长沙龙圆满落幕
- 数据结构相关重点(个人总结)