ListView的优化

       Adapter是listview和数据源间的中间人,当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图;触摸滚动时,频繁调用;支持成百上千条数据。既然是大量数据,就会使用到很多布局,给布局绑定数据,listview将占用大量资源还可能会产生卡顿现象。

效果如下:

 

       下面来看看代码:

1.利用convertview回收视图,效率提高200%。

if (convertView == null) {
view = layoutInflater.inflate(R.layout.item, null);
holder = new ViewHolder();
holder.imgIcon = (ImageView) view.findViewById(R.id.img_icon);
holder.txtTitle = (TextView) view.findViewById(R.id.txt_title);
holder.txtContent = (TextView) view.findViewById(R.id.txt_content);
holder.txtNum = (TextView) view.findViewById(R.id.txt_num);

view.setTag(holder);
} else {
view = convertView;
holder = (ViewHolder) view.getTag();
}

2.利用viewholder模式,效率在提高50%

static class ViewHolder {
   ImageView imgIcon;
   TextView txtTitle,txtContent,txtNum;
}

在Adapter的代码中,在getView方法里首先判断convertView是否为空,若为空则加载相应布局,若不为空则直接

使用该布局,这能够很有效的使用Android为listview提供的缓存机制:只加载一屏的布局,之后滑动出来的item使

用的是之前已经加载的布局的缓存;而使用静态的ViewHoulder的目的则是节省了findViewById的时间。如果不使

用ViewHolder,每次getView的时候都需要得到一次子布局,而这也是很耗时并且耗资源的;如果使用了

ViewHolder作为子布局的缓存,使用View的setTag方法将缓存与每个item绑定,则也可以省去了findViewById的

事件;而将ViewHolder设置为static的目的是指在初始化Adapter时初始化一次这个内部类,否则将会在每次创建

Adapter时都要初始化一次,而这是没有必要的。

ListView的优化也是面试中常问的问题,这里总结一下:

1.convertView的复用,减少每次都去加载layout文件。

2.ViewHolder缓存item条目的引用,减少findviewbyid的次数。

3.要对数据进行分页加载,item的布局层级要越少越好,判断手势,快速滑动时不加载里面的图片,如果item中有图片一定要用异步加载,而且里面的图片尽量要用缩略图或者小图。这样分点列出,说明你是一个善于总结的人,能增加面试官对你的印象。

 

demo下载地址:http://download.csdn.net/detail/u014727709/9723931
转载自:http://blog.csdn.net/u014727709/article/details/53911767

欢迎start,欢迎评论,欢迎指正

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想你依然心痛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值