Android ListView的性能优化(ViewHolder和HashMap)

一、对于ListView的优化,一般步骤如下:
1、复用convertView:
首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView的方法,这个方法会传入一个convertView的参数,返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存,创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)也是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环器)的构件,就是当ListView的Item从上方滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从下方生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的Item的View,所以说如果能重用这个convertView,就会大大改善性能。

2、使用viewHolder:
我们都知道在getView方法中的操作是这样的:先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,找到每一个子View,如:一个TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,就是使用viewHolder,把每一个子View都放在Holder中,当第一次创建convertView对象时,把这些子view找出来。然后用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。当第二次重用convertView时,只需从convertView中getTag取出来就可以。

3、使用HashMap做view缓存(下面代码有演示)

4、缓存数据(图片缓存):

5、分页加载:
实际上很简单,就是“点击”或者“上滑”之后调用加载方法,加载指定条目的item,如果加载的条目总数超过了item的总条目,那么就一条一条加载,其中需要复写onScroll()方法和onScrollStateChanged()方法,用来监听listview的滑动事件。

6、异步加载数据:
这个是一个取巧的做法,就是开启子线程加载数据到adapter,然后加载期间使用进度条提示用户正在加载,加载成功使用hanlder中sendmessage方法通知主线程更新UI。

二、使用ViewHolder进行优化:
public View getView(int position, View convertView, ViewGroup parent) {   
// TODO Auto-generated method stub   
Holder holder = null;   
if(convertView==null) {   
convertView=LayoutInflater.from(context).inflate(resource, null);   
holder=new Holder();   
holder.imageView=(ImageView) convertView.findViewById(R.id.listitem_pic);   
holder.title=(TextView) convertView.findViewById(R.id.listitem_title);   
holder.content=(TextView) convertView.findViewById(R.id.listitem_content);   
convertView.setTag(holder);   
}else{   
holder=(Holder) convertView.getTag();   
}   
holder.imageView.setImageResource(Integer.parseInt(data.get(position).get(from[0]).toString()));   
holder.title.setText(data.get(position).get(from[1]).toString());   
holder.content.setText(data.get(position).get(from[2]).toString()); return convertView;   
}     
class Holder{   
ImageView imageView;   
TextView title;   
TextView content;   


三、使用HashMap做缓存进行优化:
HashMap m = new HashMap();     
public View getView(int position, View view, ViewGroup parent) {     
View convertView = m.get(position);   
if (convertView != null) {  
 return convertView;   
} else {     
convertView=LayoutInflater.from(context).inflate(resource, null);     
ImageView imageView=(ImageView) convertView.findViewById(R.id.listitem_pic);     
TextView title=(TextView) convertView.findViewById(R.id.listitem_title);     
TextView content=(TextView) convertView.findViewById(R.id.listitem_content);      
m.put(position, convertView);    
 }   
}

你可能感兴趣的:(Android开发)