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的缓存机制的更多相关文章

  1. 【移动开发】ViewPager缓存机制

    1.    实现ViewPager的页面懒加载:在某些情况下,例如使用ViewPager查看多张大图,此时多张图片不能一次性载入,只有在浏览该页面时才载入(或者预先载入下一页面)页面的具体内容.2. ...

  2. Android学习——ListView的缓存机制

    在使用ListView的时候,需要加载适配器和数据源,这篇文章主要介绍一下ListView的使用以及利用ListView的缓存机制来减少系统的初始化时间. ListView的使用 ListView和V ...

  3. Bitmap缓存机制

    Bitmap缓存机制 载入一个bitmap到UI里面比較简单直接.可是,假设我们一次载入大量的bitmap数据的时候就变得复杂了.很多情况下(比方这些组件:ListVIew,GridView或者Vie ...

  4. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  5. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  6. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  7. Spring缓存机制的理解

    在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...

  8. hibernate缓存机制(转)

    原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...

  9. [转]Android ListView 与 RecyclerView 对比浅析—缓存机制

    从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...

随机推荐

  1. 有用的php函数

    filter系列函数 filter_input   通过名称获取特定的外部变量,并且可以通过过滤器处理它 filter_input(INPUT_GET, 'a', FILTER_SANITIZE_NU ...

  2. UIView动画

    UIView动画 一.commitAnimations方式使用UIView动画 1.commitAnimations方式使用UIView动画 [UIView beginAnimations:@&quo ...

  3. Mysql创建新用户后无法登录,提示 Access denied for user 'username'@'localhost' (using password: YES)

    MySQL创建新用户后无法登录,提示 Access denied for user 'username'@'localhost' (using password: YES) ,多半是因为存在匿名用户, ...

  4. JAVA学习博客---2015-7

    @Updata 2015.7.17  开始熟悉API.WPS首字母自动大写,有的没有加#编号的,其实方法首字母不是大写例如Char charAt 实际上是char charAt.当然骆驼写法charA ...

  5. HTTP03--DNS知识

    一.域名解析过程 1. 浏览器检查自身缓存,缓存时间为几分钟到小时不等,通过设置TTL属性确定. 2. 若1未找到,则查OS缓存,如windows下的host文件,linux的/etc/hosts文件 ...

  6. SQLServer 获取第几周开始日期

    不多说直接上code DECLARE @CurrDay DATETIME=GETDATE() --SET @CurrDay=CAST(('2013-01-10')AS DATETIME) --SET ...

  7. 【腾讯Bugly干货分享】浅谈Android自定义锁屏页的发车姿势

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57875330c9da73584b025873 一.为什么需要自定义锁屏页 锁屏 ...

  8. mongodb(回滚)

    事实上mongodb是不支持事务的,个人理解原因如下:1.避免大量对document加锁,从而影响性能,2.非关系型的数据库,从设计上就应能尽可能的比较关联复杂的多document,一个数据应能记录在 ...

  9. [.net 面向对象编程基础] (10) 类的成员(字段、属性、方法)

    [.net 面向对象编程基础] (10) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态 ...

  10. 我和Markdown故事

    我遇见了Markdown 我喜欢的地方 我要吐槽的地方 适用人群和使用场景 Markdown使用简介 如何入门? Markdown编辑器们 如何在博客园中使用Markdown 引用 我遇见了Markd ...