ViewPager中View的复用

本文介绍了一种针对 Android ViewPager 的自定义 Adapter 实现方法,通过优化 instantiateItem 和 destroyItem 方法,实现了 ViewHolder 的复用,有效减少了内存消耗和提高了界面响应速度。

  1. public class MyViewPagerAdapter extends PagerAdapter {  
  2.   
  3.     //显示的数据  
  4.     private List<DataBean> datas = null;  
  5.   
  6.     private LinkedList<View> mViewCache = null;  
  7.   
  8.     private Context mContext ;  
  9.   
  10.     private LayoutInflater mLayoutInflater = null;  
  11.   
  12.   
  13.     public MyViewPagerAdapter(List<DataBean> datas, Context context) {  
  14.         super();  
  15.         this.datas = datas;  
  16.         this.mContext = context ;  
  17.         this.mLayoutInflater = LayoutInflater.from(mContext) ;  
  18.         this.mViewCache = new LinkedList<>();  
  19.     }  
  20.   
  21.     @Override  
  22.     public int getCount() {  
  23.         Log.e("test","getCount ");  
  24.         return this.datas.size();  
  25.     }  
  26.   
  27.     @Override  
  28.     public int getItemPosition(Object object) {  
  29.         Log.e("test","getItemPosition ");  
  30.         return super.getItemPosition(object);  
  31.     }  
  32.   
  33.     @Override  
  34.     public Object instantiateItem(ViewGroup container, int position) {  
  35.         Log.e("test","instantiateItem " + position);  
  36.         ViewHolder viewHolder = null;  
  37.         View convertView = null;  
  38.         if(mViewCache.size() == 0){  
  39.             convertView = this.mLayoutInflater.inflate(R.layout.viewadapter_item_layout ,  
  40.                     null ,false);  
  41.             TextView textView = (TextView)convertView.findViewById(R.id.view_pager_item_textview);  
  42.             viewHolder = new ViewHolder();  
  43.             viewHolder.textView = textView;  
  44.             convertView.setTag(viewHolder);  
  45.         }else {  
  46.             convertView = mViewCache.removeFirst();  
  47.             viewHolder = (ViewHolder)convertView.getTag();  
  48.         }  
  49.   
  50.         viewHolder.textView.setText(datas.get(position).title);  
  51.         viewHolder.textView.setTextColor(Color.YELLOW);  
  52.         viewHolder.textView.setBackgroundColor(Color.GRAY);  
  53.   
  54.         container.addView(convertView ,ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT );  
  55.   
  56.         return convertView;  
  57.     }  
  58.   
  59.     @Override  
  60.     public void destroyItem(ViewGroup container, int position, Object object) {  
  61.         Log.e("test","destroyItem " + position);  
  62.         View contentView = (View) object;  
  63.         container.removeView(contentView);  
  64.         this.mViewCache.add(contentView);  
  65.     }  
  66.   
  67.     @Override  
  68.     public boolean isViewFromObject(View view, Object o) {  
  69.         Log.e("test","isViewFromObject ");  
  70.         return view == o;  
  71.     }  
  72.   
  73.     public final class ViewHolder{  
  74.         public TextView textView ;  
  75.     }  
  76. }  






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值