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/ ...
随机推荐
- [转]mysql drop、truncate和delete比较
一.drop table tb drop将表格直接删除,没有办法找回. 立刻释放磁盘空间 ,不管是 Innodb和MyISAM . 二.truncate (table) tb 该命令可以清空一个表里的 ...
- Mac OS X双系统变回虚拟机
Mac OS X双系统变回虚拟机 自从装了双系统后,感觉不要太好,装了虚拟机就开始有工作的干劲了.不妙的是,我在Win7系统里并没有装office,用不了word文档就写不了笔记和总结.我不太想在Wi ...
- 【C-分支结构】
一.关系运算符 双目运算符 自左向右结合 关系运算符的优先级低于算术运算符,高于赋值运算符 <(小于) <=(小于或等于) >(大于) >=(大于或等于) ==(等于) !=( ...
- JavaScript + HTML 虚拟键盘效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- tomcat 运行程序很慢 运行一段时间就报错: java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space 全称是Permanent Generation space,是指内存的永久保存区域. 由于这块内存主要是被JVM存放 ...
- 分享一个异步任务在遇到IO异常时支持递归回调的辅助方法
public void TryAsyncActionRecursively<TAsyncResult>( string asyncActionName, Func<Task<T ...
- 用avalon实现一个完整的todomvc(带router)
照着todomvc官网的例子,做了一个avalon版的todos,功能全都有了,而且加了router模块,比司徒大大写的都完善(≧▽≦)/~ js文件整整100行,初次使用avalon,书写过程中绕了 ...
- ECSHOP农行支付接口开发(含手机端)
对于ECSHOP来说,支付是以接口的形式存在的.于是: 1:首先添加接口文件 includes\modules\payment下,增加abcbank.php,代码如下: <?php /** * ...
- jdk研究——java.lang
jdk研究 volatile 是什么意思? 如何看jdk源码? 如何调试源码!---------仔细解读关键类,关键代码,常用的api的解释! 自己有疑问的不懂地方-------- 不懂的太多怎么办. ...
- MyBatis入门学习(三)
在实际开发中,我们希望文件配置是分类配置存放,需要的时候引入即可.如果多文件的配置混合配置使用,那么对项目的后期维护将增加难度. 一.对于连接数据库的配置单独放在一个properties文件中 1.对 ...