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. recyclerview item点击无效_让你彻底掌握RecyclerView的缓存机制

    点击上方蓝字关注 ?? 来源:肖邦kakahttps://www.jianshu.com/p/3e9aa4bdaefd 前言 RecyclerView这个控件几乎所有的Android开发者都使用过(甚 ...

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

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

  3. RecyclerView详解一,使用及缓存机制

    本文大致会先讲解RecyclerView的基础知识及使用,最后会深入讲解一点原理.当然,本人知识水平有限哈,太深入的东西我现在还没接触到,还请大家包容,阿里嘎多~ 一.RecyclerView的历史与 ...

  4. Django缓存机制

    Django缓存机制三个粒度:1 全站缓存 settings.py 全局配置文件用中间件:MIDDLEWARE = [# 'django.middleware.cache.UpdateCacheMid ...

  5. MyBatis复习笔记6:MyBatis缓存机制

    MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...

  6. java设置缓存机制

    2019独角兽企业重金招聘Python工程师标准>>> java设置缓存机制 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实 ...

  7. Mybait缓存机制

    MyBatis同大多数ORM框架一样,提供了一级缓存和二级缓存的支持. 一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空. 二级缓存:二级缓 ...

  8. LeetCode实战:LRU缓存机制

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Design and ...

  9. 微服务架构下静态数据通用缓存机制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 |  my.oschina.net/u/3971241/bl ...

最新文章

  1. 团队-象棋游戏-模块测试过程
  2. 设计模式C++实现(10)——桥接模式
  3. Notepad++ 删除空白行的方法(转)
  4. ArcGIS中的WKID(转)
  5. 信用卡使用十年的心得体会(图)
  6. go struct结构
  7. 训练dnn_[预训练语言模型专题] MT-DNN(KD) : 预训练、多任务、知识蒸馏的结合
  8. 【爬虫剑谱】一卷3章 软件篇-Anaconda的安装及配置
  9. C++基础教程之重载运算符和重载函数
  10. 雅虎团队经验:网站页面性能优化的 34条
  11. app live photo_live photo动态壁纸下载-Live Photo动态壁纸app下载 苹果版v2.1-PC6苹果网...
  12. CMD文件的编写说明,比较详细的 1·什么是CMD文件,它有什么作用。
  13. 计算机专业读研期间的规划,计算机专业研究生的读研规划
  14. Android 谷歌拼音输入法最新发布
  15. 服务器带宽打开网页很慢,网速快但是打开网页慢是怎么回事 浏览器打开网页慢的解决办法汇总...
  16. threejs的转场动画 (基于Tween实现)、平滑切换场景
  17. 解决unable to find valid certification path to requested target
  18. 【Python教程】十四、找不到对象?用Python自己写一个|类与对象(二)
  19. 纷享销客百思特 | 数字化营销赋能企业新增长沙龙圆满落幕
  20. 数据结构相关重点(个人总结)

热门文章

  1. 企业创新系列之:青苹之末
  2. 2003 DHCP升级到2008 DHCP
  3. python程序不出结果_超详细的Python入门教程,1小时就可以学会
  4. python爬虫如何配置动态爬虫代理
  5. 如果你是Python初学者,就从这个开始
  6. 信息系统监理师题库_信息系统监理题库
  7. Python中非常有用的三个数据科学库
  8. 26岁想转嵌入式软件开发来得及吗?参加嵌入式培训好不好?
  9. (每日一题)P3723 [AH2017/HNOI2017]礼物(经典FFT)
  10. #6280. 数列分块入门 4(区间修改,区间查询)