ListView中convertView和ViewHolder的工作原理

w和Adapter
参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html
工作原理:
 1.ListView针对List中每个item,要求adapter给我一个视图(getView)
 2.一个新的视图被返回并显示

如果我们有上亿个item要显示怎么办?为每个项目创建一个新视图?NO!这不可能~~~Android实际上为你缓存了视图

Android中有个叫做Recycler(反复循环器)的构件,下图是它的工作原理:

1.如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中
2.ListView先请求一个type1视图(getView),然后请求其他可见的项目。conVertView在getView中时null的
3.当item1滚出屏幕,并且一个新的项目从屏幕地段上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1.你只需要设定新的数据返回convertView,不必重新创建一个视图。这样直接使用convertView从而减少了很不不必要view的创建


!!!!!!更快的方式是定义一个ViewHolder,将convertView的tag设置为ViewHolder,不为空是重新使用

ViewHolder只是将需要缓存的那些view封装好,convertView的setTag才是将这些缓存起来供下次调用
当你的listview里布局多样化的时候 viewholder的作用就有比较明显的体现了。 当然了,单一模式的布局一样有性能优化的作用 只是不直观。  假如你2种模式的布局 当发生回收的时候 你会用setTag分别记录是哪两种   这两种模式会被封装到viewholder中进行保存方便你下次使用。 VH就是个静态类 与缓存无关的

[java] view plaincopy
print?
  1. <span style="font-family:Microsoft YaHei;font-size:18px;color:#3366ff;"><strong>public class MultipleItemsList extends ListActivity {  
  2.     
  3.     private MyCustomAdapter mAdapter;  
  4.     
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         mAdapter = new MyCustomAdapter();  
  9.         for (int i = 0; i < 50; i++) {  
  10.             mAdapter.addItem("item " + i);  
  11.         }  
  12.         setListAdapter(mAdapter);  
  13.     }  
  14.     
  15.     private class MyCustomAdapter extends BaseAdapter {  
  16.     
  17.         private ArrayList mData = new ArrayList();  
  18.         private LayoutInflater mInflater;  
  19.     
  20.         public MyCustomAdapter() {  
  21.             mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);  
  22.         }  
  23.     
  24.         public void addItem(final String item) {  
  25.             mData.add(item);  
  26.             notifyDataSetChanged();  
  27.         }  
  28.     
  29.         @Override  
  30.         public int getCount() {  
  31.             return mData.size();  
  32.         }  
  33.     
  34.         @Override  
  35.         public String getItem(int position) {  
  36.             return mData.get(position);  
  37.         }  
  38.     
  39.         @Override  
  40.         public long getItemId(int position) {  
  41.             return position;  
  42.         }  
  43.     
  44.         @Override  
  45.         public View getView(int position, View convertView, ViewGroup parent) {  
  46.             System.out.println("getView " + position + " " + convertView);  
  47.             ViewHolder holder = null;  
  48.             if (convertView == null) {  
  49.                 convertView = mInflater.inflate(R.layout.item1, null);  
  50.                 holder = new ViewHolder();  
  51.                 holder.textView = (TextView)convertView.findViewById(R.id.text);  
  52.                 convertView.setTag(holder);  
  53.             } else {  
  54.                 holder = (ViewHolder)convertView.getTag();  
  55.             }  
  56.             holder.textView.setText(mData.get(position));  
  57.             return convertView;  
  58.         }  
  59.     
  60.     }  
  61.     
  62.     public static class ViewHolder {  
  63.         public TextView textView;  
  64.     }  
  65. }</strong></span>  


参考资料:

http://www.cnblogs.com/xiaowenji/archive/2010/12/08/1900579.html

http://www.eoeandroid.com/thread-72369-1-1.html

http://www.cnblogs.com/felix-hua/archive/2012/01/06/2314436.html

http://blog.csdn.NET/jacman/article/details/7087995

http://fatkun.com/2012/01/Android-viewholder.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

简单的for()循环使用方式foreach

知识点&#xff1a; 1、foreach使用。 2、小数随机数的生成&#xff0c;Random.nextFloat()。 3、将字符串转化为字符数组&#xff0c;String.toAharArray()。 Java SE5引入了一种新的更加简洁的for语法用于数组和容器&#xff0c;即foreach语法&#xff0c;表示不必创建int变量…

RTOS 任务间互斥的难题

作者 | strongerHuang微信公众号 | 嵌入式专栏在基于RTOS开发项目时&#xff0c;通常都会遇到互斥的情况&#xff0c;比如&#xff1a;几个任务都要使用一个UART串口进行发送数据。如果不加互斥锁&#xff0c;优先级高的任务&#xff0c;会抢占串口并发送数据&#xff0c;则有可…

武汉工程大学计算机学院研究生难吗,武汉工程大学考研难吗?一般要什么水平才可以进入?...

问&#xff1a;从武汉工程大学毕业的学生就业怎么样&#xff1f;值不值得报考&#xff1f;答&#xff1a;2020年武汉工程大学就业质量报告未公布&#xff0c;从2019年武汉工程大学就业质量报告来看&#xff1a;2019届硕士毕业生就业463人&#xff0c;就业率为95.66%。2019届研究…

android中绘图Paint.setAntiAlias()和Paint.setDither()方法的作用

转载&#xff1a;http://blog.csdn.net/lovexieyuan520/article/details/50732023 在自定义View中&#xff0c;这两个Paint.setAntiAlias()和Paint.setDither()方法用的很多&#xff0c;都只有一个boolean值&#xff0c;作用大家未必清楚&#xff0c;今天抽了点时间研究下&…

简单分析STM32和51的区别

分享本文&#xff0c;简单分析STM32与51单片机的区别与取舍之处。单片微型计算机简称单片机&#xff0c;简单来说就是集CPU&#xff08;运算、控制&#xff09;、RAM&#xff08;数据存储-内存&#xff09;、ROM&#xff08;程序存储&#xff09;、输入输出设备&#xff08;串口…

OpenGL ARB 看来终于想通了,OpenGL SDK终于要出来了。

OpenGL 一直缺乏一个SDK的支持&#xff0c;所以让使用者都要自力更生的去收集资源。正因为支持的不利&#xff0c;所以才让一部分人转投技术支持完备的Direct 3D。 现在情况终于有所改观了&#xff0c;OpenGL会于今年早期推出一个统一的SDK。内容包括参考文档、教程、示例演…

自己做计算机三级,计算机三级辅导:自己“做”软驱

缺少了软驱这位“老朋友”&#xff0c;有时还真不太方便。有些商业软件在安装或更新时会要求从软盘中读取安装信息&#xff0c;远的如过去的Office 97中的钥匙盘&#xff0c;近的如瑞星杀毒软件安装时的协议盘。这种时候&#xff0c;我们该怎么办呢?很明显&#xff0c;您不太可…

深圳,四月

我是一个工程师&#xff0c;每天有干不完的活&#xff0c;做不完的事情&#xff0c;还有加不完的班&#xff01;认识的一个同学要去北京&#xff0c;我们昨天一块吃饭&#xff0c;他说了未来的计划&#xff0c;他说让我去北京了去找他&#xff0c;他还说让我把地址给他&#xf…

OOB与COM交互读写本地文件

相信读过前几篇Silverlight Out of Browser实例教程的朋友已经对Silverlight的OOB应用有了一定的认识和了解。今天&#xff0c;我们将讨论Silverlight Out of Browser的另外一个功能实例&#xff0c;Silverlight OOB与COM API的交互操作。在开始实例之前&#xff0c;我们先了解…

Java中遍历删除ArrayList中多个元素

Java中遍历删除ArrayList多个元素 Iterator itr list.iterator(); while(itr.hasNext()) {int i itr.next();if (i > 5) { // filter all ints bigger than 5itr.remove();} }

github生成SSH公钥

第一步&#xff1a;头像下面有个setting,进去 第二步&#xff1a;找到 SSH and GPG keys 这个目录&#xff0c;点击&#xff0c;右边有个 New SSH key&#xff0c;这里就是填写公钥的地方&#xff0c;那么公钥怎么生成呢&#xff1f; 第三步&#xff1a;终端输入 ssh-keygen…

oracle服务说明

注&#xff1a;SID - 数据库标识HOME_NAME - Oracle Home名称&#xff0c;如OraHome92、OraHome81&#xff08;1&#xff09;OracleServiceSID 数据库服务&#xff0c;这个服务会自动地启动和停止数据库。如果安装了一个数据库&#xff0c;它的缺省启动类型为自动。服务进程为O…

洛阳理工学院计算机类分数线,2010洛阳理工学院招生对口计算机吗?分数线大概是多少...

就上大学网为您推荐类似问题答案问题1&#xff1a;2010年唐山职业技术学院招收计算机对口分数线大概是多少&#xff1f;你的分数查不多&#xff0c;报第一纸鸢问题不大&#xff01;问题2&#xff1a;2010年河南省洛阳市理工学院大专录取分数线是多少&#xff1f;洛一高600分&am…

在Google工作的十年,也是我开心的十年

大家好&#xff0c;我是写代码的篮球球痴&#xff0c;昨晚看到bug君发的这篇文章&#xff0c;文章的主人公在Google工作了10年&#xff0c;我认真看了文章里的每一个字&#xff0c;我特别羡慕这样的工作和环境&#xff0c;当然&#xff0c;我相信我们有一天也会是这样的&#x…

谈判高手子贡---引导“用户”的专家

谈判高手子贡---引导“用户”的专家Jack zhai子贡是孔子的弟子&#xff0c;但他更为让人乐道的是他出色的外交才能。子贡复姓端木&#xff0c;名赐&#xff0c;卫国人&#xff0c;思维敏捷&#xff0c;嘴皮上的功夫&#xff0c;绝对不亚于后来的苏秦与张仪。故事说的是公元前48…

流媒体传输协议系列之--RTSP协议详解

1. RTSP连接的建立过程 RTSPServer类用于构建一个RTSP服务器&#xff0c;该类同时在其内部定义了一个RTSPClientSession类&#xff0c;用于处理单独的客户会话。 首先创建RTSP服务器(具体实现类是DynamicRTSPServer)&#xff0c;在创建过程中&#xff0c;先建立Soc…

身份证明检索失败,如何解决?

今天遇到一个很奇怪的问题2台几乎完全一样的机器&#xff0c;连同一台ORACLE服务器&#xff0c;可是一台机上测试成功&#xff0c;另一台机器测试失败&#xff0c;神奇&#xff01;上网搜索了资料后发现问题&#xff0c;解决方法如下&#xff0c;本人已经实践证明下面的方法确实…

纠结

几年前&#xff0c;我一同事回家创业&#xff0c;当时我们一起做软件开发&#xff0c;他觉得上班没意思&#xff0c;就决定回老家创业&#xff0c;当时他创业的项目是零售项目&#xff0c;离职回去筹备了几个月&#xff0c;跟我们看到的创业老板一样&#xff0c;当时他也去挖了…

管理系统中计算机应用第二章,管理系统中计算机应用第二章.doc

管理系统中计算机应用第二章.doc第二章 企业管理的信息化平台一、单项选择题(本大题共30小题&#xff0c;每小题1分&#xff0c;共30分)1.从理论上分析&#xff0c;传统的IP地址(IPv4)最多可以访问的用户数是( )A.255*255*255*255   B.8*8*8*8   C.32*32*32*32   D.256*2…

更新了一个新版本的editplus 语法文件(for nagios)

从editplus上下载的nagios 语法文件,发现不支持nrpe.cfg 很多参数也没有 在它上面更新了一下,版权是原作者的 转载于:https://blog.51cto.com/yahoon/743633