优化二:ide
前面是对view对象的复用作的优化,咱们通过上面的优化以后,咱们不须要每个view都从新生成了。下面咱们来解决下一个每一次都须要作的工做,那就是view中组件的查找:优化
TextView tv_item = (TextView) view.findViewById(R.id.tv_item);this
实际上,findViewById是到xml文件中去查找对应的id,能够想象若是组件多的话也是挺费事的,若是咱们可让view内的组件也随着view的复用而复用,那该是多美好的一件事啊。。实际上谷歌也推荐了一种优化方法来作应对,那就是从新建一个内部静态类,里面的成员变量跟view中所包含的组件个数类型相同,咱们这里的view只包含了一个TextView,因此咱们的这个静态类以下:code
private static class ViewHolder {xml
private TextView tvHolder;对象
}文档
那么这个viewHolder类咱们要如何使用才能够达到复用效果呢?基本思路就是在convertView为null的时候,咱们不只从新inflate出来一个view,而且还须要进行findviewbyId的查找工做,可是同时咱们还须要获取一个ViewHolder类的对象,并将findviewById的结果赋值给ViewHolder中对应的成员变量。最后将holder对象与该view对象“绑”在一块。get
当convertView不为null时,咱们让view=converView,同时取出这个view对应的holder对象,就得到了这个view对象中的TextView组件,它就是holder中的成员变量,这样在复用的时候,咱们就不须要再去findViewById了,只须要在最开始的时候进行数次查找工做就能够了。这里的关键在于如何将view与holder对象进行绑定,那么就须要用到两个方法:setTag和getTag方法了:it
@Overrideio
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
// 判断convertView的状态,来达到复用效果
if (null == convertView) {
// 若是convertView为空,则表示第一次显示该条目,须要建立一个view
view = View.inflate(MainActivity.this, R.layout.listview_item,
null);
//新建一个viewholder对象
holder = new ViewHolder();
//将findviewbyID的结果赋值给holder对应的成员变量
holder.tvHolder = (TextView) view.findViewById(R.id.tv_item);
// 将holder与view进行绑定
view.setTag(holder);
} else {
// 不然表示能够复用convertView
view = convertView;
holder = (ViewHolder) view.getTag();
}
// 直接操做holder中的成员变量便可,不须要每次都findViewById
holder.tvHolder.setText(list.get(position));
return view;
}
通过上面的作法,可能你们感受不太到优化的效果,根据Google的文档,实际优化效果在百分之5左右。