public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
View view;
// 1
if (convertView == null) {
view = LayoutInflater.from(getContext()).inflate(resourceId, null);
} else {
view = convertView;
}
// 2
ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
// 3
fruitImage.setImageResource(fruit.getImageId());
fruitName.setText(fruit.getName());
return view;
}
上面的代码可以分成三个部分,
注释1部分:系统返回一个 convertView,这个是系统的复用,在代码中看看这个convetView是不是空的, 如果是空的就给它布局,如果不是就直接复用。
注释2部分:通过 findViewById
找到目标控件
注释3部分:让数据源给设置数据。
这是一个没有使用ViewHolder的ListView。接下来看看实现了ViewHolder的代码是什么样的:
2. 实现了ViewHolder的ListView
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit = getItem(position);
ViewHolder holder = null;
// 1
if (convertView == null) {
convertView = mInflater.inflate(R.layout.lv_item, null);
holder = new ViewHolder();
holder.textView = (TextView)convertView.findViewById(R.id.fruit_name);
holder.imageView = (ImageView)convertView.findViewById(R.id.fruit_image);
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
// 2
holder.fruitImage.setImageResource(fruit.getImageId());
holder.fruitName.setText(fruit.getName());
return convertView;
}
}
public static class ViewHolder {
public TextView fruitName;
public ImageView fruitImage;
}
上面是一个实现了ViewHolder的ListView,它的代码可以分成两个部分:
注释1部分:复用ListView的 convertView
(1)如果为空,为其创建一个布局和ViewHolder
(一个装载着布局的容器),然后通过 findViewById()
找到目标控件,将convertView和目标控件装进ViewHolder,通过 setTag()
装到view中去。
(2)如果不为空,从convertView中取出 ViewHolder
注释2部分:让数据源给设置数据,设置在 ViewHolder的成员----目标控件中去。