美文网首页
2-4-6 BaseAdapter 优化

2-4-6 BaseAdapter 优化

作者: 努力学习的安同学 | 来源:发表于2018-06-19 16:49 被阅读0次

标注:本文为个人整理,仅做自己学习参考使用,请勿转载和转发
2018-06-19: 初稿。参考博主coder-pig

0. 引言

  • 上一节主要介绍了ListView的简单使用属性
  • BaseAdapter中比较重要的两个方法为,getCount()和getView(),界面上有多少列就会调用多少次getView,这个时候可以看到,每次都是新inflate的一个view,都要进行这个xml的解析,这样就会很浪费资源,在布局很复杂的时候就很麻烦
  • 对BaseAdapter的优化,优化的两点有,复用convertView以及ViewHolder的重要组件,不用每次都findViewById

1. 复用ConvertView

  • 界面上有多少个item,getView方法就会被调用多少次
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    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的缓存对象,可以臧家一个判断
@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;
}

这个版本还不是很优化,还是每次都需要findViewById

2. ViewHolder重用组件

  • getView()会被调用多次,那么findViewbyId不一样得调用多次,而ListView一般都是一样的布局,还可以继续优化,所以需要自定义一个类进行优化
@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;
}

这个可以这么写,但是其中findViewById可以继承到ViewHolder中形成一个构造方法,然后单独将viewHolder抽出一个类,还有一个版本,更加详细的优化了BaseAdapter,先码住

相关文章

网友评论

      本文标题:2-4-6 BaseAdapter 优化

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