用PagerAdapter的时候会反复调用instantiateItem和destroyItem来创建和销毁View,没有复用性。这里封装了一个可复用View的PagerAdapter,给实现类留下的抽象方法是:

/**
* 获取view方法,子类实现这个方法来获取渲染View
*
* @param convertView 如果是null则没有可复用的View,如果非null则是可复用的View
* @param position
* @return
*/
protected abstract View getView(View convertView, int position);
 
 
命名跟ListView的Adapter留下的接口名一样。
 
 
内部实现是维护一个View池来保存被destroyItem销毁的View,在instantiateItem的时候先看池子里有没有闲置可用的View。
 
 
使用这个View池的代码如下:
 
 
private SparseArray<View> mPageViews = new SparseArray<View>();
 
 
@Override
public Object instantiateItem(ViewGroup container, int position) {
    // 获取复用的view给子类去用,没有可复用的view时为null
    //pullViewFromPool()就是传给实现类的convertView
    View view = getView(pullViewFromPool(), position);
    // 记录该view以在destroyItem中能找到
    mPageViews.put(position, view);
    // 添加到view pager
    container.addView(view);
    return view;
}
 
 
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    View view = mPageViews.get(position);
    // 把要删除的view放到pool里以供复用
    pushViewToPool(view);
    // 从view pager中删除
    container.removeView(view);
}
 
 
 View池的实现如下:
 
//View池数据结构
private List<View> mPageViewPool = new ArrayList<View>();
 
 //从池子里拿View
private View pullViewFromPool() {
    View view = null;
    for (View v : mPageViewPool) {
        view = v;
        break;
    }
    if (view != null) {
    mPageViewPool.remove(view);
    }
    return view;
}
 
 //把View倒进池子
private void pushViewToPool(View view) {
    if (!mPageViewPool.contains(view)) {
        mPageViewPool.add(view);
    }
}
 
完整代码在Gist: 可复用View的PagerAdapter: https://gist.github.com/Viyu/5832bed2b20c6c121891
 

可复用View的PagerAdapter的更多相关文章

  1. Android学习笔记之ListView复用机制

    PS:满打满算,差不多三个月没写博客了...前一阵忙的不可开交...总算是可以抽出时间研究研究其他事情了... 学习内容: 1.ListView的复用机制 2.ViewHolder的概念 1.List ...

  2. List view优化

    ListView 针对每个item,要求 adapter "返回一个视图" (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据 ...

  3. ListView中不同类型view的实现

    首先创建请求队列,一个活动中只需要一个,因此放在Application中: public class MyApplication extends Application{ private static ...

  4. Android PagerAdapter

    本基类是ViewPager提供填充页面内容的适配器(数据与显示内容之间桥梁).通常,人们不是直接使用本基类的,而是使用这个基类的实现:FragmentPagerAdapter   或者Fragment ...

  5. Android——ViewPager滑动背景渐变(自定义view,ViewPager)

    效果: ActivityBackgroundImage,java(自定义视图) package com.example.chenshuai.test322; import android.conten ...

  6. ViewPager Fragment PagerAdapter MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  7. 使用View填充ViewPager

    ViewPager在app开发中十分常见.今天以一个例子详细解读下ViewPager的基础知识. 一.什么是ViewPager 可以这样理解,ViewPager就相当于一个容器,它的里面可以装view ...

  8. PagerAdapter刷新问题

    一.PagerAdapter介绍 PagerAdapter简介 ListView 大家应该都很熟悉吧!ListView 一般都需要一个 Adapter 来填充数据,如 ArrayAdapter.Sim ...

  9. Android-Adapter-View复用机制

    前言 相信Android开发者对ListView不会陌生,使用ListView需要设置相应的Adapter才能展示数据.Adapter到底是什么东西?让我们来一探究竟. Adapter p1.png ...

随机推荐

  1. OSX10.11 删除系统自带的软件

    之前一直用sudo rm - rf 系统的浏览器名字 正常删除safari 升级到10.11后,完全没作用了 需要关闭系统的什么安全模式 csrutil disable 再进入系统使用此命令可正常删除 ...

  2. 屌丝逆袭--Asp.net快速入门学习教程 第1晚

    本人屌丝一名,因工作原因,不能白天学习编程,所以只能做夜猫子学习编程,期待一天能逆袭成一名高帅富的技术大牛(靠,都想到流口水了........囧). 本教程记录本屌丝学习Asp.net的过程,大牛就飞 ...

  3. Lua与C的交互

    Lua 与 C 的交互 Lua是一个嵌入式的语言,它不仅可以是一个独立运行的程序,也可以是一个用来嵌入其它应用的程序库. C API是一个C代码与Lua进行交互的函数集,它由以下几部分构成: 1.  ...

  4. SHIFT后门拿服务器之方法总结

    提权工具如下:cmd.exe Churrasco.exe nc.exe 提权前提:Wscript组件成功开启 如果Wscript组件被关闭,则使用以下方法开启: 源代码: <object run ...

  5. jquery 中的事件冒泡

    废话少说,先来一段代码热热身: <!DOCTYPE html> <html> <head> <title>demo</title> < ...

  6. ES6新特性--多行文本

    由于多行字符串用\n写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用` ... `表示: `这是一个 多行 字符串`;

  7. JavaScript内置对象与原型继承

    (一)   理解JavaScript类定义 1>关于内置对象理解 console.log(Date.prototype.__proto__===Object.prototype    //tru ...

  8. localdomain的linux域

    both和and的区别? both强调(两者)都,用于肯定语气, and字面意思是"和,而且",是用于表示并列关系的句子,通常位于最后两个人或物之间,将将人物串联起来 如: thi ...

  9. 关于精简安装office2010的步骤

    首先我们安装系统都会安装一个办公套件:office当然你也可以选择使用wps但我个人比较讨厌wps的广告 然而使用office完整安装不仅消耗资源大启动速度慢,而且一些功能我都用不到,所以我这几来一个 ...

  10. Ubuntu10.04下安装Ns2的一系列错误及解决方案

    安装之前改一下nam1.11下的agent.h文件73行 Null改为0 第一个错误: xxx configuration: Syntax error: Unterminated quoted str ...