代码例如以下:

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. Scala-基础-数组(1)

    import junit.framework.TestCase import scala.collection.mutable.ArrayBuffer; //数组(1) //知识点-定义数组,变长数组 ...

  2. js中时钟表盘

    1.js时钟表盘 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  3. MySQL性能优化必备25条

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  4. Sublime——基本操作

    基本安装 程序下载地址:https://www.sublimetext.com/ package control安装 View -> Show Console打开控制台或者用快捷键ctrl+~打 ...

  5. Oracl常用e函数整理

    最近学Oracle数据库,常常遇到Oracle数据库函数问题,经过默默地琢磨处理,总结了一些Oracle数据库常用函数. ------------------------------------ -- ...

  6. GetArxPath

    extern HINSTANCE _hdllInstance;CString GetArxPath(){ CString strArxPath; GetModuleFileName(_hdllInst ...

  7. Java面试问题——线程全面详解总结

    一.多线程是什么?为什么要用多线程? 介绍多线程之前要介绍线程,介绍线程则离不开进程. 首先进程 :是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元: ...

  8. 服务器做ssh免秘钥登陆

    集群内服务器做非root用户免秘钥登陆:1.node1新建用户abc1,制作公钥.私钥(一路回车键即可)ssh-keygen –t rsa将自动在/home/abc1/.ssh/目录下创建公私钥文件如 ...

  9. 洛谷 2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

    [题解] 就是基环外向树森林找环,然后从环向外统计size就可以了. #include<cstdio> #include<cstring> #include<algori ...

  10. 【01】CSS制作的图形

    [01]CSS制作的图形   绘制五角星:   通过border绘制三角形.然后通过transfrom来旋转35度. 绘制对称的图形,最后绘制顶部的三角形即可.   元素本身,加上:before和:a ...