博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android viewHolder处理listView滑动
阅读量:6816 次
发布时间:2019-06-26

本文共 2035 字,大约阅读时间需要 6 分钟。

hot3.png

在没有用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内部类的这个特性吸引了设计者?如果有谁清楚这个问题还请不吝赐教。

转载于:https://my.oschina.net/u/579493/blog/183766

你可能感兴趣的文章
Fedora18设置终端快捷键 和 桌面快捷方式
查看>>
取消NavigationBar左右两边的空隙
查看>>
Ubuntu 12.04 Gedit中文乱码解决办法
查看>>
修改symfony sfDoctrineGuardPlugin验证密码的方法
查看>>
Vbird的Linux私房菜学习笔记之正则表达式-特殊字符
查看>>
数据的作用域
查看>>
js中括号用于自执行测试
查看>>
ssh 公钥 密钥
查看>>
c#设计模式-单例模式
查看>>
Ehcache web cahce 缓存改良版
查看>>
F5集群配置公共irule,解决X-Frame-Options漏洞及host头漏洞
查看>>
mysql 创建日期列之timestamp
查看>>
VMM系列之使用VMM服务器构建 Hyper-V主机(4)
查看>>
详测 Generics Collections TList (7): Items、Contains
查看>>
配置FTP服务器(2) 本地用户下载和上传
查看>>
多线程编程(11) - 多线程同步之 Mutex (互斥对象)[续]
查看>>
【Java每日一题】20161214
查看>>
requireJs 模块化简陋版本
查看>>
我的友情链接
查看>>
How to upgrade vim to version 8 on CentOS 7
查看>>