①继上一次FruitAdapter的getView()方法每次的调用都要对布局进行一次重新加载
这次使用getView中的converView参数,用于将之前加载好的布局进行缓存,以便重复使用
先判断布局是否存在
若不存在,则加载布局,若存在,则用convertView进行重用
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
}else{
view = convertView;
}
②FruitAdapter的getView()方法中还是调用了findVIewById来获取一次控件实例
由此借助ViewHolder进行优化
新增的ViewHolder类对控件实例进行缓存。创建viewholder对象并将控件所有实例都放在里面,
然后用setTag将对象存在View里。当convertView中不为空,就调用getTag方法重新取出ViewHolder。这样就没必要每次都用findViewById来获取控件了
package activitytest.example.wan.listviewtest;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
/**
* Created by wan on 2018/8/19.
*/
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int resourceID;
public FruitAdapter(Context context, int textViewResourceId,List<Fruit>objects){
super(context,textViewResourceId,objects);
resourceID = textViewResourceId;
}
class ViewHolder{
ImageView fruitImage;
TextView fruitName;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);//获得当前项fruit实例
View view ;
ViewHolder viewHolder;
if(convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
viewHolder = new ViewHolder();
viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);//将ViewHolder存储在View中
}else{
view = convertView;
viewHolder =(ViewHolder)view.getTag();//重新获取ViewHolder
}
viewHolder.fruitImage.setImageResource(fruit.getImageID());
viewHolder.fruitName.setText(fruit.getName());
// view = LayoutInflater.from(getContext()).inflate(resourceID,parent,false);
// ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
//TextView fruitName =(TextView)view.findViewById(R.id.fruit_name);
//fruitImage.setImageResource(fruit.getImageID());
//fruitName.setText(fruit.getName());
return view;
}
}