在写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代替。效果一样的。