用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. 自然语言17_Chinking with NLTK

    https://www.pythonprogramming.net/chinking-nltk-tutorial/?completed=/chunking-nltk-tutorial/ 代码 # -* ...

  2. ubuntu下JDK的安装

    硬盘上有下载好的JDK,直接解压后配置profile环境变量就行 export JAVA_HOME=/usr/lib/jvm/java-8-oracle export JRE_HOME=${JAVA_ ...

  3. IM即时通讯

    即时通讯,由于项目需求和不可抗力因素用的融云 当然我更倾向于用环信亲加等 使用融云遇到的那些坑: 1.集成时的坑: ,编译环境要求太高    项目中有很多旧的东西  达不到其标准 直接用最新版,出错, ...

  4. document.body.scrollTop用法

    网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...

  5. JAVA GUI随笔

    Java的布局管理器提供了一种层面的抽象,自动将用户界面映射到所有的窗口系统.GUI组件放置在容器中,它们的位置由容器的布局管理器来管理. 布局管理器是使用布局管理器类创建的. 注:同一个对象无论添加 ...

  6. CSS中常见的位置(position)属性

    常用的位置属性列表: position(top.bottom.left.right) .overflow.z-index position用法: 值 描述 relative 相对定位,原位置仍占用空间 ...

  7. Docker Compose to CoreOS

    taken from https://docs.docker.com/compose/install/ the only thing is that /usr is read only, but /o ...

  8. python sys os hashlib_MD5 模块

    模块 内置模块是Python自带的功能,在使用内置模块相应的功能时,需要[先导入]再[使用] 一.sys 用于提供对Python解释器相关的操作: ? 1 2 3 4 5 6 7 8 9 sys.ar ...

  9. http模拟请求工具

    http模拟请求工具: postman(chrome应用) Request Maker(chrome插件) Request Maker(网站:http://www.requestmaker.com/) ...

  10. MySQL各版本的区别

    文章出自:http://blog.sina.com.cn/s/blog_62b37bfe0101he5t.html 感谢作者的分享 MySQL 的官网下载地址:http://www.mysql.com ...