美文网首页
Adapter的优化

Adapter的优化

作者: 小星star | 来源:发表于2019-01-22 14:30 被阅读1次

参考:
http://www.runoob.com/w3cnote/android-tutorial-baseadapter.html

  1. 为什么我们要优化Adapter?
    在上次写了的动物说Adapter中,我们从代码 中可以看出比较重要的两个方法:getCount()和getView(),界面上有多少列就会调用多少次getView, 这个时候可能看出一些端倪,每次都是新inflate一个View,都要进行这个XML的解析,这样会 很浪费资源,当然,几十列或者几百列的列表并不能体现什么问题,但假如更多或者布局更加复杂? 所以学习ListView的优化很重要,而本节针对的是BaseAdapter的优化,优化的两点有,复用convertView 以及使用ViewHolder重用组件,不用每次都findViewById,我们具体通过代码来体会吧!
  2. 优化方法:
    (1) 复用ConvertView
    加个判断
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    
      if(convertView == null){
          convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
      }
    
      ImageView img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
      TextView txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
      TextView txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
    
      img_icon.setBackgroundResource(mData.get(position).getaIcon());
      txt_aName.setText(mData.get(position).getaName());
      txt_aSpeak.setText(mData.get(position).getaSpeak());
      return convertView;
    }
    
    这样inflate()不用每次重新加载xml。其实这个convertView是系统提供给我们的可供服用的View 的缓存对象。
    (2)ViewHolder重用组件
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
      ViewHolder holder = null;
      if(convertView == null){
          convertView = LayoutInflater.from(mContext).inflate(R.layout.item_list_animal,parent,false);
          holder = new ViewHolder();
          holder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
          holder.txt_aName = (TextView) convertView.findViewById(R.id.txt_aName);
          holder.txt_aSpeak = (TextView) convertView.findViewById(R.id.txt_aSpeak);
          convertView.setTag(holder);   //将Holder存储到convertView中
      }else{
          holder = (ViewHolder) convertView.getTag();
      }
      holder.img_icon.setBackgroundResource(mData.get(position).getaIcon());
      holder.txt_aName.setText(mData.get(position).getaName());
      holder.txt_aSpeak.setText(mData.get(position).getaSpeak());
      return convertView;
      }
    
    static class ViewHolder{
      ImageView img_icon;
      TextView txt_aName;
      TextView txt_aSpeak;
    }
    
    没错就是这么简单,你以后BaseAdapter照着这个模板写就对了,另外这个修饰ViewHolder的 static,关于是否定义成静态,跟里面的对象数目是没有关系的,加静态是为了在多个地方使用这个 Holder的时候,类只需加载一次,如果只是使用了一次,加不加也没所谓!
    上面也说了这个converView其实是系统提供给我们可用使用的view缓存对象,这个viewholder只是把它作为一部分捆绑到了conveView上面,来实现不必每次findview。

相关文章

网友评论

      本文标题:Adapter的优化

      本文链接:https://www.haomeiwen.com/subject/scbljqtx.html