BaseAdapter 优化

简介: 学习ListView的优化很重要,而本节针对的是BaseAdapter的优化,优化的两点有,复用convertView 以及使用ViewHolder重用组件,不用每次都findViewById,我们具体通过代码来体会吧。

学习ListView的优化很重要,而本节针对的是BaseAdapter的优化,优化的两点有,复用convertView 以及使用ViewHolder重用组件,不用每次都findViewById,我们具体通过代码来体会吧。

1.复用ConvertView

界面上有多少个Item,那么getView方法就会被调用多少次! 我们来看看上一节我们写的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;
}

2.ViewHolder重用组件

getView()会被调用多次,那么findViewById不一样得调用多次,而我们的ListView的Item 一般都是一样的布局,我们可以对这里在优化下,我们可以自己定义一个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的时候,类只需加载一次,如果只是使用了一次,加不加也没所谓!

相关文章
|
SQL Java 数据库连接
|
5月前
|
开发工具 开发者 iOS开发
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
testflight上架ipa包-只有ipa包的情况下如何修改签名信息为苹果开发者账户对应的信息-ipa苹果包如何手动改签或者第三方工具改签-优雅草卓伊凡
111 20
|
7月前
|
机器学习/深度学习 存储 并行计算
《探秘Hogwild!算法:无锁并行SGD的神奇之路》
Hogwild!算法是一种实现无锁并行随机梯度下降(SGD)的创新方法,广泛应用于深度学习和大规模数据处理。它通过数据并行架构、无锁更新策略和异步更新机制,允许多个计算节点同时更新共享模型参数,无需等待或同步。这不仅减少了通信开销,提高了资源利用率,还简化了实现和扩展。Hogwild!在图像识别、语音识别等任务中显著加速了模型训练,推动了人工智能技术的发展。
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
清华微软最新力作:用物理学革新Transformer注意力,大海捞针精度暴涨30%!
【10月更文挑战第30天】Transformer模型在自然语言处理(NLP)中表现出色,但在处理长文本和复杂任务时存在注意力分配不当的问题。清华大学和微软研究院提出了Diff Transformer,通过计算两个独立软最大注意力图之间的差异,有效消除噪声,提高模型性能。Diff Transformer在语言建模、减少幻觉、增强上下文学习能力和减少激活异常值等方面表现出显著优势,但也存在计算复杂度增加、对超参数敏感和适用范围有限的局限性。论文地址:https://arxiv.org/abs/2410.05258
137 2
|
10月前
|
存储 人工智能 安全
【通义】AI视界|苹果停止签署iOS 18.0.1,升级用户无法降级
本文由通义自动生成,涵盖24小时内精选的五条科技资讯:奥特曼谈OpenAI未来发展方向,ChatGPT新搜索功能上线遇故障,Perplexity AI选举搜索面临挑战,马斯克谈特斯拉造手机的可能性,以及苹果停止签署iOS 18.0.1。更多精彩内容,欢迎访问通通知道。
|
11月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
98 1
|
SQL JavaScript 前端开发
websql数据库javascript操作库--websqlWrapper
websql数据库javascript操作库--websqlWrapper
|
安全 Java 编译器
深入理解Java语言中的方法重载(Overloading)
深入理解Java语言中的方法重载(Overloading)
348 1
|
机器学习/深度学习 JSON 数据挖掘
如何使用API数据接口给自己创造收益
使用API数据接口创造收益的方法有很多,以下是一些常见的方法,并附有代码示例:

热门文章

最新文章