ListView中ConvertView和ViewHolder
1、概述
- ListView是Android中非常常见的控件通过Adapter架起数据与界面显示的桥梁,MVC思想在其中得到了很好地体现:
M:model 数据模型 添加到ListView中显示的数据
V:View 视图 在界面中显示的每一条样式(不只是通常的每一条,比如QQ聊天间隔显示的样式)
C:Control 控制 通过Activity来协调全局
其中的关键所在就是Adapter(适配器),它就是一座桥梁,Adapter提供对数据的访问,也负责为每个数据产生每个对应的View,产生View之后然后将View添加到ListView之中,如何优雅的使用ListView请往下移步
2、ConvertView和ViewHolder
当每条数据进入Adapter时,adapter就要开始调用其 getView(int position, View convertView, ViewGroup parent)方法,以最简单的item为例:每个item仅包含一个图片(imageView)和一行文本(textView)
2.1、最原始的方法(不实用容易导致内存泄露)
非常不推荐这样用,毫不优雅毫无美感!!!
- public void getView(int position , View convertView , ViewGroup parent){
- View item = mInflater.inflate(R.layout.list_view, null);
- (TextView)item.findViewById(R.id.text).setText(DATA[position]);
- (ImageView)item.findViewById(R.id.img).setImageBitmap(icon);
- return item;
- }
2.2 使用 ConVertView回收视图(看看就好,小数据量可以使用)
- public void getView(int position , View convertView , ViewGroup parent){
- if(convertView == null){
- convertView = mInflater.inflate(R.layout.list_view, null);
- }
- (TextView)convertView.findViewById(R.id.text).setText(DATA[position]);
- (ImageView)convertView.findViewById(R.id.img).setImageBitmap(icon);
- return convertView;
- }
这里提到了“回收”,在Android中提供了一种叫做Recycler(反复循环器)的构件
【原理】就是 当ListView的Item从屏幕上方滚出视线之外后(下图Item1),对应的Item的View会被缓存到Recycler中,相应的会从屏幕下方生成一个新的Item(对应下图的Item8),此时调用的getView中的conView中就是已经被缓存的(item1),不用再创建新的视图上面的代码就是重用了这个convertView改善了listview的性能。
总之,初始时ListView会从Adapter中根据当前的屏幕布局实例化一定数量的view对象,同时ListView会将这些view对象缓存起来。当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费资源也浪费时间,也会使得内存占用越来越大。
2.3 convertView+ViewHolder(大量数据加载时常用)
先上代码
- static class ViewHolder{
- private TextView tv;
- private ImageView iv;
- }
- public void getView(int position , View convertView , ViewGroup parent){
- ViewHolder holder;
- if(convertView == null){
- convertView = mInflater.inflate(R.layout.list_view, null);
- holder = new ViewHolder();
- holder.tv = (TextView)convertView.findViewById(R.id.text);
- holder.iv = (ImageView)convertView.findViewById(R.id.img);
- convertView.setTag(holder);
- }else{
- holder = (ViewHolder) convertView.getTag();
- }
- holder.tv.setText(DATA[position]);
- holder.iv.setImageBitmap(icon);
- return convertView;
- }
这种方式使用到了ViewHolder,其实ViewHolder就是一个很普通的类,类似一个Bean,用来将混存的View封装好,convertView中的SetTag将这些缓存打上对应的标签以供下次直接打包调用,大大提高了速度,特别是在ListView布局多样化时ViewHolder作用就更加明显了。
3、其他
【1】隐藏ListView的滚动条
android:srcollbar=“none”
【2】取消ListView的点击效果
android:listSelector = “#00000000”或者使用android自带的透明效果android:listSelector = “@android:color/transparent”
(不然点击就会出现很难看的黄色背景色。)
【3】设置条目分割线
android:divider="@android:color/darker_gray"
android:dividerHeight = "10dp"
ListView中ConvertView和ViewHolder的更多相关文章
- ListView中convertView和ViewHolder的工作原理
http://blog.csdn.net/bill_ming/article/details/8817172
- 关于ListView中convertView的缓存个数的探究
在面试的时候经常会被问到一个有关ListView的问题:一个ListView的高度最多可以显示5个item,但是却有20条数据要显示,问最多会有多少个convertView会被复用?或者如在ListV ...
- Android之ListView性能优化——使用ConvertView和ViewHolder
使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...
- 转-ListView的性能优化之convertView和viewHolder
ListView的性能优化之convertView和viewHolder 2014-05-14 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/ ...
- ListView的性能优化之convertView和viewHolder
转载请注明出处 最近碰到的面试题中经常会碰到问"ListView的优化"问题.所以就拿自己之前写的微博客户端的程序做下优化. 自己查了些资料,看了别人写的博客,得出结论,ListV ...
- ListView性能优化——convertView&viewHolder
ListView优化大致从以下几个角度:1.复用已经生成的convertView:2.添加viewHolder类:3.缓存数据(图片缓存):4.分页加载. 具体方案: 1.如果自定义适配器,那么在ge ...
- Android 如何在 ListView 中更新 ProgressBar 进度
=======================ListView原理============================== Android 的 ListView 的原理打个简单的比喻就是: 演员演 ...
- ListView 中含有 EditText 导致焦点丢失的问题
ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...
- android代码优化----ListView中自定义adapter的封装(ListView的模板写法)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
随机推荐
- JavaScript 字符串(String)对象
String 对象用于处理已有的字符块. JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号: 实例 var ...
- Linux常见目录及命令介绍
一.Linux中常用的目录介绍: / -根目录 /bin -命令保存目录(普通用户亦可读取的命令) /boot -启动目录,启动相关文件 /d ...
- Java 求n天前的时间或者n月前的时间
时间格式化 public static String DEFAULT_FORMATDATE = "yyyy-MM-dd"; 1.n天前的日期 /** * luyanlong * 默 ...
- Oracle数据库常用命令记录
1.Sql建表 CREATE TABLE AAABBBCCCDDD( ID ) primary key, AAAAAAAA ) not NULL, BBBBBBBB ), CCCCCCCC ), DD ...
- iOS中的颜色
最近在改Bug的时候,才注意到iOS 中的颜色竟然也大有文章,特来记录一下. 先说一下问题,因为某界面中有用xib实现的一个view,而这个view 只在UIColletionView的layout ...
- 算法之路(三)----查找斐波纳契数列中第 N 个数
算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...
- Thread 方法
Thread类的一些被Thread对象调用的方法: 1 public void start() 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 2 public void run() ...
- android的消息通知栏
在android的应用层中,涉及到很多应用框架,例如:Service框架,Activity管理机制,Broadcast机制,对话框框架,标题栏框架,状态栏框架,通知机制,ActionBar框架等等. ...
- 复习java逻辑---实现猜数字游戏
package shopping; import java.util.*; public class SendGiftMenu { public static void main(String[] a ...
- 2.QLabel,QPushButton,QLineEdit,QComboBox,QCheckBox,QRadioButton,QTextEdit,QTextBrowser,QGroupBox,QSl
1.新建一个空项目(其它项目->空QT项目): 2 添加新文件(选择C++Class) MyWidget.h #ifndef MYWIDGET_H #define MYWIDGET_H ...