一、对于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<INTEGER, view=""> m = new HashMap<INTEGER, view="">();
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);
}
}
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<INTEGER, view=""> m = new HashMap<INTEGER, view="">();
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);
}
}