关于ListView提升性能的方法

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

 
 




你可能感兴趣的:(ListView,大数据,性能优化)