ListView的性能优化主要体现在两种情况下:1.大数据从服务器端加载的性能优化,2.ListView对已加载完的大数据在滚动时的优化。
针对第一种情况,一般就是分页加载来处理,这里就不细说了,主要说对于第二种情况的优化。
如何提高ListView的滚动速度,ListView的滚动速度的提高在于getView方法的实现,通常我们的getView方法会这样写:
public View getView(int paramInt, View paramView, ViewGroup paramViewGroup)
{
View localView = LayoutInflater.from(UserChooseActivity.this.getApplicationContext()).inflate(R.layout.cell_userchoose_list, null);
ImageView localImageView = (ImageView)localView.findViewById(R.id.userlistimage);
TextView tvName = (TextView)localView.findViewById(R.id.userlistname);
TextView tvID = (TextView)localView.findViewById(R.id.userlistid);
TextView tvToken = (TextView)localView.findViewById(R.id.userlisttoken);
Guest localGuest = (Guest)getItem(paramInt);
localImageView.setImageResource(R.drawable.rc_default_portrait);
tvName.setText(localGuest.getGuestName());
tvID.setText(localGuest.getGuestId());
tvToken.setText(localGuest.getGuestToken());
return localView;
}
这样ListView的滚动速度其实是最慢的,因为adapter每次加载的时候都要重新构建LayoutInflater和所有你的组件。
所以这里我们通过View的缓存(paramView也就是getView的第二个参数)+ViewHolder来提高性能
通过缓存paramView,这种利用缓存paramView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能
ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。
当我们判断 convertView == null 的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。
//通过paramView和ViewHolder来提升listview在已加载的数据时滑动的效率
public View getView(int paramInt, View paramView, ViewGroup paramViewGroup) {
ViewHolder viewHolder;
if(paramView==null){
paramView = LayoutInflater.from(UserChooseActivity.this.getApplicationContext()).inflate(R.layout.cell_userchoose_list, null);
viewHolder = new ViewHolder();
viewHolder.imageView = (ImageView)paramView.findViewById(R.id.userlistimage);
viewHolder.tvID = (TextView)paramView.findViewById(R.id.userlistid);
viewHolder.tvName = (TextView)paramView.findViewById(R.id.userlistname);
viewHolder.tvToken = (TextView)paramView.findViewById(R.id.userlisttoken);
paramView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) paramView.getTag();
}
// View localView = LayoutInflater.from(UserChooseActivity.this.getApplicationContext()).inflate(R.layout.cell_userchoose_list, null);
// ImageView localImageView = (ImageView)localView.findViewById(R.id.userlistimage);
// TextView tvName = (TextView)localView.findViewById(R.id.userlistname);
// TextView tvID = (TextView)localView.findViewById(R.id.userlistid);
// TextView tvToken = (TextView)localView.findViewById(R.id.userlisttoken);
Guest localGuest = (Guest)getItem(paramInt);
viewHolder.imageView.setImageResource(R.drawable.rc_default_portrait);
viewHolder.tvName.setText(localGuest.getGuestName());
viewHolder.tvID.setText(localGuest.getGuestId());
viewHolder.tvToken.setText(localGuest.getGuestToken());
return paramView;
}
<pre name="code" class="java"> //通过paramView和ViewHolder来提升listview在已加载的数据时滑动的效率
public static class ViewHolder{
ImageView imageView;
TextView tvName;
TextView tvID;
TextView tvToken;
}