在使用Listview或GridView时,经常需要自定义数据适配器,一般会重写getView()。该方法中有一个convertView参数,加载数据时使用View。对初学者来说简单但效率低下的方法publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ImageViewimg=(ImageView)item.findViewById(R.id.img);TextViewprice=(TextView)item.findViewById(R.id.price);img.setImageResource(R.drawable.ic_launcher);price.setText("$"+list.get(position).price);returnitem;}每次要加载视图,必须重新创建许多视图对象。如果一个listview有10000条数据,这个加载方法就会停止。使用convertView利用Android的Recycler机制,使用convertView回收View,效率有了大幅度的提升。每次创建View都是耗时的,所以对getview方法传入的convertView应该充分利用!=null的判断。publicViewgetView(intposition,ViewconvertView,ViewGroupparent){if(convertView==null){convertView=inflater.inflate(R.layout.good_list_item,null,false);}TextViewtv_price=(TextView)convertView.findViewById(R.id.price)ImageViewiv=(ImageView)convertView.findViewByID(R.id.img);returnconvertView;}使用ViewHolderViewHolder封装需要缓存的view,convertView的setTag就是缓存这些,以备下次调用。当你的listview中的布局多样化的时候,viewholder的作用就很明显了,效率又提升了。View的findViewById()方法也比较耗时,需要考虑只调用一次,然后使用View.getTag()方法获取ViewHolder对象。classViewHolder{ImageViewimg;TextViewprice;}publicViewgetView(intposition,ViewconvertView,ViewGroupparent){ViewHolderholder=newViewHolder();if(convertView==null){convertView=inflater.inflate(R.layout.good_list_item,null,false);holder.img=(ImageView)convertView.findViewById(R.id.img);holder.price=(TextView)convertView.findViewById(R.id.price);convertView.setTag(holder);}else{holder=(ViewHolder)convertView.getTag();}//设置holderholder.img.setImageResource(R.drawable.ic_launcher);holder.price.setText("$"+list.get(position).price);returnconvertView;}useViewHolder优雅地使用ViewHolder每次都是一遍又一遍的findViewById,一遍又一遍的在ViewHolder中添加View的定义,view多了是不是觉得烦,base-adapter-helper类库好像完美解决这个问题。它的设计思想是用SparseArray来存储视图引用,而不是原来的ViewHolder,不需要声明很多View,简洁明了。我自己也写了一个简单版的ViewHolder。publicclassViewHolder{privatefinalSparseArray
