ListView的几种常见的优化方法(二)

优化二: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左右。

相关文章
相关标签/搜索