关于ListView提升性能的方法

本文详细阐述了ListView性能优化的核心方法——利用ViewHolder技术来提高滚动速度。通过缓存View对象和复用已加载的数据视图,显著提升了ListView在处理已加载大量数据时的滚动效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值