android ViewPager之PagerAdapter中View的重用

在写PagerAdapter的时候,需要重写instantiateItem(ViewGroup  container ,int position)

此方法中,将需要加载的View,添加到container中。

PagerAdapter不能直接使用像ListView那样的ViewHolder,来实现View的复用。

所以,如果每次加载,都要新建一个View出来就会很占用内存。

如果你的View都是一样的,比如都是ImageView,那么就可以使用一个List将回收的View存起来

再次加载的时候,优先从回收List中加载,不必再去new.

大致的逻辑如下:

private LinkedList < View> recycledViews = new LinkedList <View > ();

public Object instantiateItem( ViewGroup container , int position ) {

// TODO Auto-generated method stub

CustomImage imageView = null;

if ( debug )

Log. e (TAG , "PagerAdapter : instantiateItem"+ "position is "+ String .valueOf (position )+ "ChildCount is:" +container .getChildCount ());

if ( recycledViews != null && recycledViews. size() >0 ) {

imageView = ( CustomImage) recycledViews .getFirst ();

recycledViews .removeFirst ();

else {

imageView = new CustomImage (mContext );

}

imageView .setImageResource (resids .get (position ));

container .addView (imageView );

return imageView;

}

@Override

public void destroyItem( ViewGroup container , int position , Object object ) {

// TODO Auto-generated method stub

if ( debug )

Log. e (TAG , "PagerAdapter : destroyItem"+ "position is"+ String .valueOf (position )+ "ChildCount is:" +container .getChildCount ());

((ViewGroup ) container ). removeView ((View ) object );

if ( object != null) {

recycledViews .addLast ((View )object );

}

}

上面的CustomView是我自定义的一个ImageView,可以用任意的View代替。效果一样的。

时间: 2024-10-08 10:06:02

android ViewPager之PagerAdapter中View的重用的相关文章

Android - ViewPager使用PagerAdapter,instantiateItem时出现IndexOutOfBoundsException

在使用PagerAdapter的时候,会有instantiateItem函数需要自己去重写. 最后一句   假如写成 ((ViewPager) container).addView(v, position); 会报错 :IndexOutOfBoundsException 将position 改成 0  就可以啦 ((ViewPager) container).addView(v, 0);

ViewPager的Adapter中视图重用

ViewPager的PagerAdapter不像ListView/GridView的BaseAdapter,它是没有内部视图重用机制的,也就是说我先inflate出来一个,然后调用destroyItem后,这个视图就被抛弃了,如果需要更多的视图,则需要再次inflate.如果ViewPager中的所有视图基本相同,就存在内存的浪费了.这里使用一个非常简单的方法实现视图的重用: List<View> mViewList = new ArrayList<View>(); public

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

效果: ActivityBackgroundImage,java(自定义视图) package com.example.chenshuai.test322; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; impor

Android Tab -- 使用ViewPager、PagerAdapter来实现

原文地址:http://blog.csdn.net/crazy1235/article/details/42678877 效果:滑动切换,自动切换. 代码: 1.布局界面通过ViewPager标签来实现视图左右切换. 2.然后通过LinearLayout增加指示器功能,表明当前展示的是第几个视图:其中指示器是通过两种小圆点图片来表示未显示和显示两种状态. <?xml version="1.0" encoding="utf-8"?> <Relativ

Android:ViewPager适配器PagerAdapter的使用

PageAdapter是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即可使用. 要使用PagerAdapter, 首先要继承PagerAdapter类,至少覆盖以下方法: 在每次创建ViewPager或滑动过程中,以下四个方法都会被调用,而instantiateItem和destroyItem中的方法要自己去实现. public abstract int getCount(); 这个方法,是获取当前窗体界面数 public a

android ViewPager中页面延迟加载的实现

对于viewpager的使用,如果说是请求的数据对内存的消耗不到的话,这是很理想的,但是如果说请求的数据对内存消耗的比较大的话这样就容易出现oom(比如说图片),在使用viewPager的时候使用setOffscreenPageLimit(int size)默认的是1,所以说我们怎么设置这个值,在加载数据的话会将当前页面和下个页面的数据同时的进行请求,这在某种情况下时非常的影响性能的,还有就是在当前页面和下个页面在viewPager中算作了同一个页面,因为你是无法通过生命周期来进行控制数据的延迟

[Android] Android ViewPager 中加载 Fragmenet的几种方式

Android ViewPager 中加载 Fragmenet的几种方式 1.当fragment里面的内容较少时,可以利用加载view 的方法来进行: private List<View> viewList; //在onCreate方法里面添加  viewList = new ArrayList<View>();        View view1 = View.inflate(this, R.layout.view1, null);        View view2 = Vie

[Android] Android ViewPager 中加载 Fragment的两种方式 方式(二)

接上文: https://www.cnblogs.com/wukong1688/p/10693338.html Android ViewPager 中加载 Fragmenet的两种方式 方式(一) 二.使用Fragment来填充ViewPager Google 官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page以及管理 每个Page的生命周期!当然它给我们提供了两个不同的Adapter,他们分别是: FragmentPageAdapter和Fragm

Android中View绘制流程以及invalidate()等相关方法分析

前言: 本文是我读<Android内核剖析>第13章----View工作原理总结而成的,在此膜拜下作者 .同时真挚地向渴望了解 Android 框架层的网友,推荐这本书,希望你们能够在Android开发里学到更多的知识 . 整个View树的绘图流程是在ViewRoot.java类的performTraversals()函数展开的,该函数做的执行过程可简单概况为 根据之前设置的状态,判断是否需要重新计算视图大小(measure).是否重新需要安置视图的位置(layout).以及是否需要重绘 (d