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的缓存机制的更多相关文章
- 【移动开发】ViewPager缓存机制
1. 实现ViewPager的页面懒加载:在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容.2. ...
- Android学习——ListView的缓存机制
在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间. ListView的使用 ListView和V ...
- Bitmap缓存机制
Bitmap缓存机制 载入一个bitmap到UI里面比較简单直接.可是,假设我们一次载入大量的bitmap数据的时候就变得复杂了.很多情况下(比方这些组件:ListVIew,GridView或者Vie ...
- 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...
- MyCat源码分析系列之——BufferPool与缓存机制
更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- Spring缓存机制的理解
在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...
- hibernate缓存机制(转)
原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...
- [转]Android ListView 与 RecyclerView 对比浅析—缓存机制
从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...
随机推荐
- 在RHEL6p5中设置网卡
前提: 在用ifconfig -a查看时已经显示出wlan0(无线网卡)的存在(即不用装驱动,驱动另记) 工具: 1.yum install wpasupplicant* 2.yum install ...
- 3.使用CXF开发webService
CXF 简介 关于 Apache CXF Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache ...
- 如何为Eclipse安装主题(Color Theme)
Eclipse开发环境默认都是白底黑字的,看到同事的Xcode中设置的黑灰色背景挺好看的,就去网上查了一下.发现Eclipse也可以设置主题. 方法1:你可以从Eclipse Marketplace中 ...
- ABP框架详解(六)Aspects
这种AOP式的设计非常类似于Asp.net MVC和WebApi中过滤器(Filter)机制,感觉没有太多可讲述的,只能谈谈设计思路. 框架中AspectAttribute特性用于设置到需要被拦截的T ...
- asp.net identity 2.2.0 在MVC下的角色启用和基本使用(一)
基本环境:asp.net 4.5.2 第一步:在App_Start文件夹中的IdentityConfig.cs中添加角色控制器. 在namespace xxx内(即最后一个“}”前面)添加 角色控制类 ...
- 今天心情好,给各位免费呈上200兆SVN代码服务器一枚,不谢!
开篇先给大家讲个我自己的故事,几个月前在网上接了个小软件开发的私活,平日上班时间也比较忙,就中午一会儿休息时间能抽出来倒腾着去做点.每天下班复制一份到U盘带回去继续摸索,没多久U盘里躺着的文件列表那叫 ...
- OpenSSL密码算法库: MD5示例小程序
OpenSSL http://www.openssl.org/ OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库.SSL协议库以及应用程序.OpenSSL 的密码算法库包含多种加密算 ...
- 可伸缩性最佳实践:来自eBay的经验
看到一篇关于系统可伸缩性(可扩展)的文章,eBay的架构师Randy Shoup写的,原文出处没找到,就不写转载的地址了.根据自己的理解对文章有修改剪切的地方. 在eBay,可伸缩性是我们每天奋力抵抗 ...
- 浮动ip
浮动ip 其实就是动态ip, 静态IP是固定不变的,不管你用不用这个IP上网,这个IP都是属于你的动态IP则是在使用的时候由DHCP服务器临时分配给你的,不用则不分配在网络中如果设置了一部分静态IP地 ...
- 这里有个坑---entity为null的问题
这里有个坑,最近加班赶个项目,忽然遇到个这个坑,先记录下来,纯当自己提高.---------每一个遇到的坑总结后都是一比财富. 我们在做项目是会使用ajax返回结果,在返回结果的时候一般选择json数 ...