代码例如以下:

public class MyViewPagerAdapter extends PagerAdapter {

    //显示的数据
private List<DataBean> datas = null; private LinkedList<View> mViewCache = null; private Context mContext ; private LayoutInflater mLayoutInflater = null; public MyViewPagerAdapter(List<DataBean> datas, Context context) {
super();
this.datas = datas;
this.mContext = context ;
this.mLayoutInflater = LayoutInflater.from(mContext) ;
this.mViewCache = new LinkedList<>();
} @Override
public int getCount() {
Log.e("test","getCount ");
return this.datas.size();
} @Override
public int getItemPosition(Object object) {
Log.e("test","getItemPosition ");
return super.getItemPosition(object);
} @Override
public Object instantiateItem(ViewGroup container, int position) {
Log.e("test","instantiateItem " + position);
ViewHolder viewHolder = null;
View convertView = null;
if(mViewCache.size() == 0){
convertView = this.mLayoutInflater.inflate(R.layout.viewadapter_item_layout ,
null ,false);
TextView textView = (TextView)convertView.findViewById(R.id.view_pager_item_textview);
viewHolder = new ViewHolder();
viewHolder.textView = textView;
convertView.setTag(viewHolder);
}else {
convertView = mViewCache.removeFirst();
viewHolder = (ViewHolder)convertView.getTag();
} viewHolder.textView.setText(datas.get(position).title);
viewHolder.textView.setTextColor(Color.YELLOW);
viewHolder.textView.setBackgroundColor(Color.GRAY); container.addView(convertView ,ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT ); return convertView;
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {
Log.e("test","destroyItem " + position);
View contentView = (View) object;
container.removeView(contentView);
this.mViewCache.add(contentView);
} @Override
public boolean isViewFromObject(View view, Object o) {
Log.e("test","isViewFromObject ");
return view == o;
} public final class ViewHolder{
public TextView textView ;
}
}

首先须要了解ViewPager的Adapter各个方法的回调机制。
这里主要看两个方法:instantiateItem()和destroyItem()。
instantiateItem()方法,是在滑动到一个新的ViewItem的时候被调用的,而destroyItem()是在当用户滑到第3个ViewItem的时候被调用,在这个时候会先调用这种方法来回收第一个ViewItem,然后在调用instantiateItem()方法来实例化第3个ViewItem。能够在adapter的各个回调方法中打出log来看这种方法被调用的时机。
利用上面所说的机制,就能够在destroyItem()的时候将要被remove掉的view回收起来,然后在instantiateItme()的时候反复利用这个view。这样,就仅仅会有3个ViewHolder实例存在。即当前显示的。还有上一个Item和下一个Item。

ViewPager中View的复用的更多相关文章

  1. ViewPager中Fragment的重复创建、复用问题

    在ViewPager中的Fragment的生命周期  随着页面的切换 当前的展示页相邻的页面生命周期一直在变化 一开始 刚进入Activity时候,ViewPager默认初始化好前两个Fragment ...

  2. android ViewPager之PagerAdapter中View的重用

    在写PagerAdapter的时候,需要重写instantiateItem(ViewGroup  container ,int position)   此方法中,将需要加载的View,添加到conta ...

  3. 【原创】【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析   1.使用场景 ViewPager+Fragment实现界面切换,界面数量>=3   2.Fragment生命周期以及与Activ ...

  4. 转载【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析

    ViewPager中切换界面Fragment被销毁的问题分析  原文链接 http://www.cnblogs.com/monodin/p/3866441.html 1.使用场景 ViewPager+ ...

  5. 解决在android开发中ViewPager中Gallery无法滑动问题

    我的是在viewpager中某个fragment中有gallery... 导致无法滑动,网上找到解决方法. 自定义Gallery. 代码: import android.content.Context ...

  6. 向 ViewPager 中添加 包含 ListView 的 Fragment

    对与fragment就不说什么了,直接看API手册吧,亲. 向 ViewPager 中添加 包含 ListView 的 Fragment 的过程比较麻烦.他所表现的效果就是新闻客户端的滑动翻页效果. ...

  7. ViewPager中使用自定义的ListView实例

    这篇内容是上一篇的延续,因为在上一篇的测试ViewPager成功了,才能实现这一篇的和ListView合在一起使用 效果图如下: 不愿意说理论,直接上代码 1.清单文件 activity_main.x ...

  8. 20ViewPager demo1,2:接收ViewPager展示View的使用

    Demo1 MainActivity .JAVA package com.qf.day20_viewpager_demo1; import java.util.ArrayList; import ja ...

  9. ViewPagerWithViewDemo【ViewPager和View搭配以及演示获取里面的值和CheckBox单选效果】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录下ViewPager和自定义布局view的搭配使用以及布局文件中单选效果.获取viewpager布局内部值的功能. 效果图 ...

随机推荐

  1. AndroidStudio3.0 Canary 8注解报错Annotation processors must be explicitly declared now.

    体验最新版AndroidStudio3. Canary 8的时候,发现之前项目的butter knife报错,用到注解的应该都会报错 Error:Execution failed for task ' ...

  2. Android PopupWindow使用时注意

    项目中使用PopupWindown出现的坑 1.部分设备,PopWindow在Android4.0后版本,出现NullPointerException调用以下方法可解决, fixPopupWindow ...

  3. Java 基础入门随笔(7) JavaSE版——面向对象定义、特征:封装、构造函数

    面向对象 面向过程:对于面向过程思想,强调的是过程(动作). 面向对象:对于面向对象思想,强调的是对象(实体). 特点: 1,面向对象就是一种常见的思想.符合人们的思考习惯.2,面向对象的出现,将复杂 ...

  4. java 基础学习笔记 - 安装

    1. 从www.sun.com中 下载jdk安装包 2. 执行安装包,安装jdk ,jre(Java运行环境) 3. 配置path路径 增加jdk下的bin目录. 配置完后需要重启cmd窗口,因为cm ...

  5. 【百度编辑器ueditor】工具,如何去掉百度编辑器 ueditor 元素路径、字数统计等

    去掉如下截图: 在百度编辑器 ueditor 根目录下: ueditor.config.js 文件中 搜索并将参数elementPathEnabled设置成false即可 常用功能开关如下: ,ele ...

  6. STL_map的使用

    转自:http://www.kuqin.com/cpluspluslib/20071231/3265.html Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在m ...

  7. 前端JavaScript入门——JavaScript变量和操作元素

    变量JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 ‘var’: var a = 123; var b = 'asd'; //同时定义多个 ...

  8. java 动态代理 和动态编程

    概述 代理分两种技术,一种是jdk代理(机制就是反射,只对接口操作),一种就是字节码操作技术.前者不能算技术,后者算是新的技术.未来将有大的动作或者较为广泛的应用和变革,它可以实现代码自我的编码(人工 ...

  9. day21-2 类的派生

    目录 类的派生 派生方法一 派生方法二 类的派生 派生:子类中新定义属性的这个过程叫做派生 派生方法一 指明道姓访问某一个类的函数:该方法与继承无关 class People: def __init_ ...

  10. Game Rank(NCPC 2016 大模拟)

    题目: The gaming company Sandstorm is developing an online two player game. You have been asked to imp ...