Android基础入门教程——2.4.3 BaseAdapter优化

标签(空格分隔): Android基础入门教程


本节引言:

上一节中我们学习了如何来使用一个ListView以及自定义一个简单的BaseAdapter,我们从代码
中可以看出比较重要的两个方法:getCount()和getView(),界面上有多少列就会调用多少次getView,
这个时候可能看出一些端倪,每次都是新inflate一个View,都要进行这个XML的解析,这样会
很浪费资源,当然,几十列或者几百列的列表并不能体现什么问题,但假如更多或者布局更加复杂?
所以学习ListView的优化很重要,而本节针对的是BaseAdapter的优化,优化的两点有,复用convertView
以及使用ViewHolder重用组件,不用每次都findViewById,我们具体通过代码来体会吧!


1.复用ConvertView:

上面也说了,界面上有多少个Item,那么getView方法就会被调用多少次!
我们来看看上一节我们写的getView()部分的代码:

  @Overridepublic 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
的缓存对象,那就坐下判断咯,修改下,优化后的代码:

 @Overridepublic 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类来对这一部分
进行性能优化!修改后的代码如下:

@Overridepublic 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的时候,类只需加载一次,如果只是使用了一次,加不加也没所谓!——Berial(B神)原话~


本节小结:

好的,关于BaseAdapter的优化大概就上述的两种,非常简单,复用ConvertView以及自定义ViewHolder
减少findViewById()的调用~如果你有其他关于BaseAdapter优化的建议欢迎提出,谢谢~

Android基础入门教程——2.4.3 BaseAdapter优化相关推荐

  1. 最新Android基础入门教程目录(完结版)

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  2. 2015年最新Android基础入门教程目录(完结版)

    2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全 ...

  3. Android基础入门教程——2.4.7 构建一个可复用的自定义BaseAdapter

    Android基础入门教程--2.4.7 构建一个可复用的自定义BaseAdapter 标签(空格分隔): Android基础入门教程 本节引言: 如题,本节给大家带来的是构建一个可复用的自定义Bas ...

  4. Android基础入门教程——2.4.10 Spinner(列表选项框)的基本使用

    Android基础入门教程--2.4.10 Spinner(列表选项框)的基本使用 标签(空格分隔): Android基础入门教程 本节引言: 本来本节是想给大家介绍一个Gallery(画廊)的一个控 ...

  5. Android基础入门教程——2.4.12 ExpandableListView(可折叠列表)的基本使用

    Android基础入门教程--2.4.12 ExpandableListView(可折叠列表)的基本使用 标签(空格分隔): Android基础入门教程 本节引言: 本节要讲解的Adapter类控件是 ...

  6. Android基础入门教程——2.4.8 ListView Item多布局的实现

    Android基础入门教程--2.4.8 ListView Item多布局的实现 标签(空格分隔): Android基础入门教程 本节引言: 本节是ListView这个小节的最后一节,给大家带来的是L ...

  7. android 编辑9图片,Android基础入门教程——1.6 .9(九妹)图片怎么玩

    Android基础入门教程--1.6 .9(九妹)图片怎么玩 Android基础入门教程 1.本节引言: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如pic1.9.png ...

  8. android设置webview缓存目录,Android基础入门教程——7.5.5 WebView缓存问题

    Android基础入门教程--7.5.5 WebView缓存问题 Android基础入门教程 本节引言:现在很多门户类信息网站,比如虎嗅,ifanr,钛媒体等等的APP,简单点说是信息阅读类的APP, ...

  9. Android基础入门教程——4.3.1 BroadcastReceiver牛刀小试

    Android基础入门教程--4.3.1 BroadcastReceiver牛刀小试 标签(空格分隔): Android基础入门教程 本节引言 本节我们将来学习Android四大组件中的第三个:Bro ...

最新文章

  1. ios集成firebase_如何将Firebase与您的应用程序集成
  2. 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
  3. C#静态构造函数调用机制
  4. Android中DisplayMetrics 获取手机屏幕分辨率
  5. Linux基础知识 | vi编辑器
  6. 翻译:SWFObject 2.0官方文档
  7. cissp认证考试指南_如何通过CISSP考试(信息安全认证)
  8. Linux内存寻址之二:逻辑地址到虚拟地址的转换
  9. Sisyphus.js 自动保存草稿 用法
  10. 微带贴片天线的分析方法-传输线模型法
  11. 怎么批量修改文件夹里照片的名字
  12. mysql权限层级体系_数据库mysql有哪些权限?层级有哪些?
  13. java 阈值 告警_处理Java异常告警最佳实践
  14. mysql 常用日期时间计算
  15. Android开发最近新闻和功能都在这里了
  16. 数组 Map 使用小结
  17. Python 习题练习
  18. 智慧书吧经典选集《一个人读书》
  19. 深度细节 | Go 的 panic 秘密都在这
  20. texlive2020 安装_TeXLive2020 Windows 10 简要安装手册

热门文章

  1. 多个视频画面拼接技术
  2. k8s之 service account token
  3. 最新激活C4D阿诺德渲染器:C4DtoA for Cinema 4D R20 for mac
  4. 2020南京邮电大学计算机考研,南京邮电大学2020电子信息考研
  5. 快速上手JDBC——Java如何在底层操作数据库
  6. Multisim6.5
  7. 如何识别并解决复杂的dcache问题
  8. traybox错误怎么办_safeboxtray.exe---应用程序错误是怎么回事?
  9. Canvas实现物体基本运动
  10. 用黄金比例评价“完美脸型”是否靠谱?