美文网首页
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