zoukankan      html  css  js  c++  java
  • [Android]ListView控件之Adapter性能优化

    Google在Google I/O大会上,提到Android在UI优化方面可以从以下五个方面入手:

    •   Adapter优化 
    •   背景和图片优化 
    •   绘图优化
    •   视图和布局优化
    •   内存分配优化

    1.Adapter优化

          在ListView中,我们可以自定义Adapter,继承BaseAdapter,再重写相应的方法,
    但需要特别注意,ListView的每一项视图加载都要经过getView这个方法,所以优化adapter
    也就在此方法。

    方案一:
     1       @Override
     2     public View getView(int position, View convertView, ViewGroup parent) {
     3         // TODO Auto-generated method stub
     4         
     5         convertView = mInflater.inflate(R.layout.img_listview_item, null);
     6         holder.imgIv = (ImageView)convertView.findViewById(R.id.imageView1);
     7         holder.itemTv = (TextView)convertView.findViewById(R.id.textView1);
     8         holder.imgIv.setImageResource(R.drawable.icon);
     9         holder.itemTv.setText(mDataItem[position]);
    10         
    11         return convertView;
    12     }

      大家可以从方案一中看到,listview每显示一项,都要调用getView方法,对于每次重复创建convertView对象以及findViewById
     方法,都会影响性能,如果ListView有显示N多项,可想而知,资源的消耗有多大!

    方案二:
     1       @Override
     2     public View getView(int position, View convertView, ViewGroup parent) {
     3         // TODO Auto-generated method stub
     4         
     5         ViewHolder holder;
     6         if(convertView == null){
     7             holder = new ViewHolder();
     8             convertView = mInflater.inflate(R.layout.img_listview_item, null);
     9             holder.imgIv = (ImageView)convertView.findViewById(R.id.imageView1);
    10             holder.itemTv = (TextView)convertView.findViewById(R.id.textView1);
    11             convertView.setTag(holder);
    12 
    13         }else{
    14 
    15             holder = (ViewHolder)convertView.getTag();
    16             
    17         }
    18         
    19         holder.imgIv.setImageResource(R.drawable.icon);
    20         holder.itemTv.setText(mDataItem[position]);
    21         
    22         return convertView;
    23     }
    24 
    25 
    26     class ViewHolder{
    27         public ImageView imgIv;
    28         public TextView itemTv;
    29     }

       从方案二中,我们看到,当convertView为null的时候才去创建convertView以及获取相应的控件对象,在最下面,还创建一个ViewHolder类,这个类是干嘛用的呢?
     它是保存每项ListView视图里的控件对象,达到缓存控件对象,而不用每次都用findViewById()去获取,节省资源,这是一个优化细节。

        注意:

        在界面初始后,第一次可见的视图项,这个要具体ListView可最多显示几项,在这几项初始时,都会调用
        if(convertView == null){
            最初几项调用...
        }

        但拉动ListView显示下面的数据时,那接下来就调用

        }else{

       holder = (ViewHolder)convertView.getTag();
       
        }

        这部分啦!

     

  • 相关阅读:
    生成一个四位数的随机验证码
    计算阶乘
    四种排序(冒泡、插入、递归、选择)
    Java基础面试被常问到知识点
    Qt中的坐标系统
    a message box to confirm the action
    点击按钮退出窗口
    为部件提供浮动提示信息
    在窗口标题栏的左上方显示图标
    PyQt5显示一个空白的窗口
  • 原文地址:https://www.cnblogs.com/hpboy/p/2584532.html
Copyright © 2011-2022 走看看