android listview重用 viewholder 用静态的好一点还是不静态的
1个回答
2015-08-03
展开全部
在没有用viewHolder的情况下,listView表现效率低下。如果加载的数量过多则会一点点的消耗内存,直到抛出oom。开始异步加载图片会出现图片错位的问题,后来查阅资料将holder里边的图片地址和图片一一对应起来,在异步加载的回调函数中将其替换回来。
holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免图标错位,在异步加载成功后替换回来
ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);
if(imageView != null){
imageView.setImageDrawable(imageDrawable);
imageView.setTag("");
}
以上关键代码解决图片错位问题。
下面是getView()方法
public View getView(int position, View rowView, ViewGroup parent){
final
MHotelInfo hotel = this.getItem(position);
if (rowView == null) {
holder =
new ViewHolder();
LayoutInflater inflater = ((Activity)
this.getContext())
.getLayoutInflater();
rowView =
inflater.inflate(R.layout.hotel_item_view, null);
holder.typeName =
(TextView) rowView.findViewById(R.id.hotelType);
holder.thumb_image=(ImageView)rowView.findViewById(R.id.img);// 缩略图
holder.distance = (TextView) rowView.findViewById(R.id.distance);
rowView.setTag(holder);
}else{
holder = (ViewHolder)
rowView.getTag();
}
// 设置ListView的相关值
holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免图标错位,在异步加载成功后替换回来
holder.typeName.setText(hotel.getTypeName());
if(null ==
hotel.getHotelTitlePic() || hotel.getHotelTitlePic().equals("")){
//如果没有图标就显示默认图标
holder.thumb_image.setImageResource(R.drawable.downloadfalse);
}else{
//异步加载图片
imageLoader.loadDrawable(hotel.getHotelTitlePic(), new ImageCallback() {
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);
if(imageView != null){
imageView.setImageDrawable(imageDrawable);
imageView.setTag("");
}
}
});
}
return
rowView;
}
static class ViewHolder {
TextView
typeName;
ImageView thumb_image;
}
但是ViewHolder为什么是被设计成static类型的,本人一直没弄清楚。在网上找了些资料但是一直没能看到一个能说服我的理由。又说节省内存,保持对象的唯一性,还有说保持图片不错乱但是个人感觉都不怎么靠谱。今天我试了下将static去掉照常运行没感觉和以前有什么区别。后来我查了下static类的一些特性,首先ViewHolder是一个内部类若是static类的话则不需要依赖外部类的对象。也就是说只有static的内部类的成员变量才可以被声明成static类型,若内部类不是static类型的则不可以声明静态成员变量。不知道是不是static内部类的这个特性吸引了设计者?如果有谁清楚这个问题还请不吝赐教。
holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免图标错位,在异步加载成功后替换回来
ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);
if(imageView != null){
imageView.setImageDrawable(imageDrawable);
imageView.setTag("");
}
以上关键代码解决图片错位问题。
下面是getView()方法
public View getView(int position, View rowView, ViewGroup parent){
final
MHotelInfo hotel = this.getItem(position);
if (rowView == null) {
holder =
new ViewHolder();
LayoutInflater inflater = ((Activity)
this.getContext())
.getLayoutInflater();
rowView =
inflater.inflate(R.layout.hotel_item_view, null);
holder.typeName =
(TextView) rowView.findViewById(R.id.hotelType);
holder.thumb_image=(ImageView)rowView.findViewById(R.id.img);// 缩略图
holder.distance = (TextView) rowView.findViewById(R.id.distance);
rowView.setTag(holder);
}else{
holder = (ViewHolder)
rowView.getTag();
}
// 设置ListView的相关值
holder.thumb_image.setTag(hotel.getHotelTitlePic());
//避免图标错位,在异步加载成功后替换回来
holder.typeName.setText(hotel.getTypeName());
if(null ==
hotel.getHotelTitlePic() || hotel.getHotelTitlePic().equals("")){
//如果没有图标就显示默认图标
holder.thumb_image.setImageResource(R.drawable.downloadfalse);
}else{
//异步加载图片
imageLoader.loadDrawable(hotel.getHotelTitlePic(), new ImageCallback() {
public void imageLoaded(Drawable imageDrawable, String imageUrl) {
ImageView imageView = (ImageView) listView.findViewWithTag(imageUrl);
if(imageView != null){
imageView.setImageDrawable(imageDrawable);
imageView.setTag("");
}
}
});
}
return
rowView;
}
static class ViewHolder {
TextView
typeName;
ImageView thumb_image;
}
但是ViewHolder为什么是被设计成static类型的,本人一直没弄清楚。在网上找了些资料但是一直没能看到一个能说服我的理由。又说节省内存,保持对象的唯一性,还有说保持图片不错乱但是个人感觉都不怎么靠谱。今天我试了下将static去掉照常运行没感觉和以前有什么区别。后来我查了下static类的一些特性,首先ViewHolder是一个内部类若是static类的话则不需要依赖外部类的对象。也就是说只有static的内部类的成员变量才可以被声明成static类型,若内部类不是static类型的则不可以声明静态成员变量。不知道是不是static内部类的这个特性吸引了设计者?如果有谁清楚这个问题还请不吝赐教。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询