zoukankan      html  css  js  c++  java
  • Android学习总结(十二)———— BaseAdapter优化

    一.BaseAdapter的基本概念

      对于Android程序员来说,BaseAdapter肯定不会陌生,灵活而优雅是BaseAdapter最大的特点。开发者可以通过构造BaseAdapter并搭载到ListView或者GridView这类多控件布局上面,实现软件所需要的布局效果。同时,BaseAdapter也是适配器里面最基础的一个类,其他的例如SimpleAdapter、ArrayAdapter都是直接或者间接继承BaseAdapter,所以说学好BaseAdapter基本就熟练掌握了适配器的使用了。

     二 .BaseAdapter的优化

      针对BaseAdapter的优化主要有两点:复用convertView 以及使用ViewHolder重用组件,不用每次都findViewById,我们具体通过代码来体会吧!

    2.1、复用ConvertView

      我们先来看一段代码,如下所示:

     1 @Override
     2 public View getView(int position, View convertView, ViewGroup parent) {
     3     convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
     4     ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
     5     TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
     6     TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
     7 
     8     img_icon.setBackgroundResource(mData.get(position).getaIcon());
     9     txt_aName.setText(mData.get(position).getaName());
    10     txt_aSpeak.setText(mData.get(position).getaSpeak());
    11     return convertView;
    12 }

      这段代码在使用ListView或者GridView的时候经常看到,界面上有多少个Item,那么getView方法就会被调用多少次,而每调用一次getView方法都要通过inflate()方法加载一次item的布局xml文件,其实这个convertView是系统提供给我们的可供复用的View 的缓存对象,那就做一下判断咯,修改下,优化后的代码:

     1 @Override
     2 public View getView(int position, View convertView, ViewGroup parent) {
     3 
     4     if(convertView == null){
     5         convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
     6     }
     7 
     8     ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
     9     TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
    10     TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
    11 
    12     img_icon.setBackgroundResource(mData.get(position).getaIcon());
    13     txt_aName.setText(mData.get(position).getaName());
    14     txt_aSpeak.setText(mData.get(position).getaSpeak());
    15     return convertView;
    16 }

      红色的代码部分就是针对convertView的使用优化,如果convertView为空,那么就表示是第一次加载布局,那么就通过inflate()方法加载item的布局xml文件,如果不为空,那么就不在重新加载,而是直接拿来使用了。

    2.2、使用ViewHolder重用组件

      在上面的代码中,我们在getView()方法内部多次调用了findViewById方法获取item布局里面的控件,也就是说,getView方法被调用多少次,那么findViewById就会调用多少次,但一般情况下,我们的ListView或者GridView的Item 一般都是一样的布局,我们可以对这里在优化下,我们可以自己定义一个ViewHolder类来对这一部分 进行性能优化!修改后的代码如下:

     1 @Override
     2 public View getView(int position, View convertView, ViewGroup parent) {
     3     ViewHolder holder = null;
     4     if(convertView == null){
     5         convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
     6         holder = new ViewHolder();
     7         holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
     8         holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
     9         holder.txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
    10         convertView.setTag(holder);   //将Holder存储到convertView中
    11     }else{
    12         holder = (ViewHolder) convertView.getTag();
    13     }
    14     holder.img_icon.setBackgroundResource(mData.get(position).getaIcon());
    15     holder.txt_aName.setText(mData.get(position).getaName());
    16     holder.txt_aSpeak.setText(mData.get(position).getaSpeak());
    17     return convertView;
    18 }
    19 
    20 static class ViewHolder{
    21     ImageView img_icon;
    22     TextView txt_aName;
    23     TextView txt_aSpeak;
    24 }

      我们的优化手段是使用一个ViewHolder来缓存Item布局里面的控件,以后编写BaseAdapter照着这个模板写就对了,另外这个修饰ViewHolder的 static,关于是否定义成静态,跟里面的对象数目是没有关系的,加静态是为了在多个地方使用这个 Holder的时候,类只需加载一次,如果只是使用了一次,加不加也没所谓!

      关于BaseAdapter优化内容就这么多了。如果还有更好的优化策略,欢迎广大园友指导!

  • 相关阅读:
    正则表达式解析
    Selenium自动化测试系列文章汇总
    Python自动化测试-正则表达式解析
    滴滴滴,ITester软件测试小栈所有资源放送!
    Selenium自动化测试-文件上传
    Selenium自动化测试-浏览器基本操作
    2020牛客暑期多校第四场-H Harder Gcd Problem(贪心构造)
    2020牛客暑期多校第三场F-Fraction Construction Problem-分数构造题(拓展欧几里得)
    洛谷P1919--A*B Problem升级版(NTT优化高精度乘法)
    洛谷P4721-分治FFT(NTT分治)
  • 原文地址:https://www.cnblogs.com/nylcy/p/6516712.html
Copyright © 2011-2022 走看看