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/ ...
随机推荐
- FLEXNET License管理
之前的程序License管理是我自己手撸的一个非常简单的东东,根据用户机器的MAC地址生成一个字串,程序执行的时候去比较这个字串.当时只是追求一个最简单的实现,像证书过期.功能点证书自然没有.这次新版 ...
- spi接口的ds1302时钟芯片控制在lcd1602上显示
spi接口的ds1302时钟芯片控制在lcd1602上显示 ...
- Ubuntu全新安装firefox最新版本
Ubuntu默认安装firefox,但是自带的软件仓库是不会随firefox更新的,我在使用中老是提示flash插件需要激活,提示中可选的解决方式有三种 1.更新flash插件,但是跳转到adobe的 ...
- React学习笔记---项目构建
简介 ReactJs由于有FB的支持,得到了社区的极大关注,同时由于ReactJs只希望专一的做好View层次上的工作,所以本身并没有涉及很多周边工具. 今天要介绍一款工具,同时包含一个构建项目模板的 ...
- ASP.NET 5系列教程 (五):在Visual Studio 2015中使用Grunt、Bower开发Web程序
基于Visual Studio 2015,你可以: 方便的管理前端包,如jQuery, Bootstrap, 或Angular. 自动运行任务,如LESS.JavaScript压缩.JSLint.Ja ...
- Elasticsearch笔记
资料 官网: http://www.elasticsearch.org 中文资料:http://www.learnes.net/ .Net驱动: http://nest.azurewebsites.n ...
- 作业七:团队项目——Alpha版本冲刺阶段-11
部分功能实现: public void actionPerformed(ActionEvent ae) { //重新开始按钮 if (ae.getSource().equals(anew)){ int ...
- 实战使用Axure设计App,使用WebStorm开发(5) – 实现页面功能
系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求 实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目 实战使 ...
- Git学习笔记(9)——自定义配置
本文主要记录了Git的一些易用化的配置和别名的使用 配置Git的命令输出带有颜色,更加醒目 //配置输出颜色 $ git config --global color.ui true //取消输出颜色 ...
- WebViewJavascriptBridge的暂时理解
直接从项目里复制了一份关于WebViewJavascriptBridge使用的代码,注释部分是自己暂时的理解.孟哥说,callHandler类似于jq里的trigger, registerHandle ...