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

        这部分啦!

     

  • 相关阅读:
    centos7.6 安装与配置 MongoDB yum方式
    MongoDB 介绍
    centos 关闭selinux
    前端 HTML标签属性
    前端 HTML 标签嵌套规则
    前端 HTML 标签分类
    前端 HTML body标签相关内容 常用标签 表单标签 form里面的 input标签介绍
    前端 HTML body标签相关内容 常用标签 表单标签 form 表单控件分类
    前端 HTML form表单标签 select标签 option 下拉框
    POJ 1426
  • 原文地址:https://www.cnblogs.com/hpboy/p/2584532.html
Copyright © 2011-2022 走看看