安卓文档

利用重用机制优化ViewPager性能

2017-10-23  本文已影响0人  SunYo

@[View池、ViewHolder重用机制]

相信大家已经非常熟练的使用ViewPager这个控件了,ViewPager的常规用法在网上随便都能搜索到,这里就不再赘述,在常规用法之外大家有没有想过优化ViewPager性能的方法呢?例如面对使用ViewPager装在成百上千张图片这种场景该怎么做呢?


让我们先回顾一下ListView的常用优化技巧:


既然ListView可以用重用机制优化性能,那么ViewPager能不能使用重用机制来优化性能?答案是可以的。
ListView的Adapter中的getView方法有一个参数是ConvertView,我们利用它实现view重用,避免每次都inflate布局xml,但是ViewPager的pageAdapter既没有getView方法也没有convertView,那我们怎么实现View的复用呢?我们知道ViewPager有预加载机制,默认预加载当前页的前后两页,而当切换到下一页的时候,非当前页及当前页的左右两页的其他页面都会被destroy掉,因此复用的思路就是构建一个View池,在页面实例化的时候先判断池子中是否有可用的view,如果有我们取出一个使用,否则就inflate一个,在页面destory的时候我们把view放入池子中备用,这样就避免了view的反复inflate,然后我们就可以仿照listview使用viewholder优化性能了,具体方法跟Listview中的一致,这里就不在赘述了,具体看代码吧。

      private Queue<View> viewPool = new LinkedList<>(); //View池

      @Override public Object instantiateItem(ViewGroup container, int position) {
        View view;
        ViewHolder viewHolder;
        //当池子中有存货就复用,否则才inflate
        if(viewPool.size() > 0){ 
          view = viewPool.poll();
          viewHolder = (ViewHolder) view.getTag();
        }else{
          view = inflater.inflate(R.layout.gallery_item, container, false);
          viewHolder = new ViewHolder();
          viewHolder.textView = ((TextView) view.findViewById(R.id.title));
          viewHolder.imageView = ((ImageView) view.findViewById(R.id.imageview));
          view.setTag(viewHolder);
        }
        viewHolder.textView.setText("Pager " + position);
        viewHolder.imageView.setImageResource(PIC_RES[position]);
        container.addView(view);
        return view;
      }

      @Override public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
        //将当前View加入到池子中
        viewPool.offer((View) object);
      }
   //定义一个ViewHolder
   class ViewHolder{
     TextView  textView;
     ImageView imageView;
   }

demo地址:https://github.com/jyyxxgz/GalleryViewPager.git

上一篇 下一篇

猜你喜欢

热点阅读