今天看到了一篇文章,讲解Listview的getView最清晰的,顺便自己也记录一下。。。
1、每一次都重新定义一个View载入布局,加载数据,该种方式是最慢的一种
public View getView(int position, View convertView, ViewGroup parent) {
View item = mInflater.inflate( R.layout.list_item_icon_text, null);
((TextView) item.findViewById(
R.id.text)).setText(DATA[position]);
((ImageView) item.findViewById( R.id.icon))
.setImageBitmap( (position & 1) == 1 ?
mIcon1 : mIcon2);
return item;
}
2、采用通过判断参数convertView是为NULL,再加载
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater. inflate(R.layout.item, parent, false);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap( (position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
该种方法放判断convertView为null时,才会去向第一种方式一样,不为空的时候直接重新使用convertView从而减少了很多不必要的View的创建,然后加载数据。(不为NULL的数据是暂存于RecycleBin中的)
3、ViewHolder方式,通过定义一个ViewHolder,将convetView的tag设置为ViewHolder,不为空时重新使用即可
//条目的布局文件中有什么组件,这里就定义什么属性
static class ViewHolder {
TextView text;
ImageView icon;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, parent, false);
holder = new ViewHolder();
//把布局文件中所有组件的对象
//封装至ViewHolder对象中
holder.text =
(TextView) convertView
.findViewById(R.id.text);
holder.icon =
(ImageView) convertView
.findViewById(R.id.icon);
//把ViewHolder对象封装至View对象中
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
//给组件设置内容
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap(
(position & 1) == 1 ?
mIcon1 : mIcon2);
return convertView;
}