Android入门教程三十六之BaseAdapter优化
上一节中我们学习了如何来使用一个ListView以及自定义一个简单的BaseAdapter,我们从代码 中可以看出比较重要的两个方法:getCount()和getView(),界面上有多少列就会调用多少次getView, 这个时候可能看出一些端倪,每次都是新inflate一个View,都要进行这个XML的解析,这样会 很浪费资源,当然,几十列或者几百列的列表并不能体现什么问题,但假如更多或者布局更加复杂? 所以学习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的时候,类只需加载一次,如果只是使用了一次,加不加也没所谓!——Berial(B神)原话~
本节小结:
好的,关于BaseAdapter的优化大概就上述的两种,非常简单,复用ConvertView以及自定义ViewHolder
减少findViewById()的调用~如果你有其他关于BaseAdapter优化的建议欢迎提出,谢谢~
关注Android系列教程上篇
关注更多文章
Android入门教程三十六之BaseAdapter优化相关推荐
- Android入门教程四十六之ViewFlipper(翻转视图)的基本使用
本节给大家带了的是ViewFlipper,它是Android自带的一个多页面管理控件,且可以自动播放! 和ViewPager不同,ViewPager是一页页的,而ViewFlipper则是一层层的,和 ...
- (转)tensorflow入门教程(二十六)人脸识别(上)
https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...
- 生日祝福小程序_广告配音剪映零基础入门教程第二十六篇:如何给朋友制作生日祝福视频...
经常听到小伙伴问到生日祝福视频怎么做,当然我想既然要为他人做生日祝福视频,那么这个人必定是自己身边比较重要的人,而生日又是每个人都是非常重要的,在这种充满意义的时刻,我们想给自己极其重要的人送上一份祝 ...
- Android入门教程四十之构建一个可复用的自定义BaseAdapter
如题,本节给大家带来的是构建一个可复用的自定义BaseAdapter,我们每每涉及到ListView GridView等其他的Adapter控件,都需要自己另外写一个BaseAdapter类,这样显得 ...
- Android入门教程四十五之ExpandableListView(可折叠列表)的基本使用
本节要讲解的Adapter类控件是ExpandableListView,就是可折叠的列表,它是ListView的子类, 在ListView的基础上它把应用中的列表项分为几组,每组里又可包含多个列表项. ...
- ionic入门教程第十六课-在微信中使用ionic的解决方案(按需加载加强版)
对于微信端来说,其实使用ionic是一个比较大的前端框架. 有更多比较轻量化的前端框架可以选择. 但是使用ionic有一个明显的优点就是,能够做到一端开发,三端同步上线. 这个梗说了好多遍了,但确实是 ...
- Android笔记(三十六) AsyncTask是如何执行的?
在上一个例子中,我们是在LoadImage的onPostExecute中修改的UI,不是说只允许在主线程中修改UI吗?我们看一下源代码是如何操作的. MainActicity.java package ...
- WPF入门教程系列十六——WPF中的数据绑定(二)
三.绑定模式 通过上一文章中的示例,学习了简单的绑定方式.在这里的示例,要学习一下绑定的模式,和模式的使用效果. 首先,我们来做一个简单示例,这个示例是根据ListBox中的选中项,去改变TextBl ...
- tensorflow入门教程(二十六)人脸识别(上)
# #作者:韦访 #博客:https://blog.csdn.net/rookie_wei #微信:1007895847 #添加微信的备注一下是CSDN的 #欢迎大家一起学习 # 1.概述 换了个固态 ...
最新文章
- python学习--基础
- mysql安装了很久_mysql-5.7.21-winx64安装过程(整了好久原因是没关闭防火墙)
- 二叉树的遍历实现-2(三级)
- IEEE公布2.5G和5G以太网IEEE 802.3bz标准
- JAM - how count is got - SAP Fiori和JAM的集成
- 使用MVC模式制作游戏-教程和简介
- BZOJ1925: [Sdoi2010]地精部落
- Java-虚拟机-执行引擎/解释器/编译
- 阿里免费开放一切AI算力的背后是什么?
- tomcat构建及session保持
- 有道词典词库_最好的免费词典和同义词库程序和网站
- java 学籍管理系统课程设计_Java课程设计-学籍信息管理系统
- 北京54坐标系和1980西安坐标系转换
- 你还不知道高情商表现怎么表现?
- python数据分析入门学习笔记
- 认知升级篇:为什么我们一定要掌握自学能力?
- resource outo区别
- php中getopt函数的使用
- Python pytest main.py文件报错main.py: error: unrecognized arguments: --html=./test_report.html问题解决
- 三维图像处理_医学有限元鼻上颌骨复合体三维有限元模型的建立
热门文章
- 关于禁止ST芯片SWD引脚导致无法下载程序问题
- ben we_​Ben结婚 WE选手Ben女友个人资料微博照片介绍
- [Window] Windows批处理(cmd/bat)常用命令小结
- Windows批处理常用命令
- 田野调查手记·浮山摩崖石刻(十七)
- 【翻译】如何选择一个开源软件许可证 Choosing an OSS license doesn’t need to be scary...
- multisim仿真 74LS147D级联芯片
- 迁移jira后,confluence不能登录解决方法
- 往Iphone里添加歌曲通过91助手
- yzh第十三课 设备和输入输出