1、描述
在getView方法中每次都将布局重新加载了一遍,当ListView快速滚动的时候这就会成为性能的瓶颈。
2、优化1
对getView方法中进行了判断,如果convertView为空,则使用LayoutInflater去加载布局,如果不为空则直接对convertView进行重用。这样就大大提高了ListView的运行效率,在快速滚动的时候也可以表现出更好的性能。
public View getView(int position,View convertView,ViewGroup parent){
Furit furit = getItem(position);
View view ;
if(convertView == null)
{
view = LayoutInflater.from(getContext().inflate(resourceId,null));
}else
{
view = convertView;
}
}
到目前为止,虽然不会再重复去加载布局,但是每次在getView方法中还是会调用View的findViewById方法来获取一次控件的实例。
2、优化2
借助一个ViewHolder来对这部分的性能进行优化。
publci View getView(int position,View convertView,ViewGroup parent){
Furit furit = getItem(position)
View view
ViewHolder viewHolder
if(convertView == null)
{
view = LayoutInflater.from(getContext(),inflate(resourceId,null))
viewHolder = new viewHolder()
viewHolder.fruitImage = (ImageView)view.findVierById(R.id.fruit_image)
viewHolder.fruitName = (TextView)view.findVierById(R.id.fruit_name)
view.setTag(viewHolder)
}else
{
view = convertView
viewHolder = (ViewHolder)view.getTag()
}
viewHolder.fruitImage.setImageResource(fruit.getImageId())
viewHolder.fruitName.setText(fruit.getName())
return view
}
class ViewHolder{
ImageView furitImage
TextView fruitName
}
新增一个内部类ViewHolder,用于对控件的实例进行缓存,当convertView为空的时候,创建一个ViewHolder对象,并将控件的实例都放在ViewHolder里,然后调用View的setTag()方法,把ViewHolder对象存储在View中。当convertView不为空的时候则调用View的getTag方法,把ViewHolder重新取出,这样所有控件的实例都缓存了ViewHolder里,就没有必要每次通过findViewById()方法来获取控件实例了。