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; }