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. private MyCustomAdapter mAdapter;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. mAdapter = new MyCustomAdapter();
  7. for (int i = 0; i < 50; i++) {
  8. mAdapter.addItem("item " + i);
  9. }
  10. setListAdapter(mAdapter);
  11. }
  12. private class MyCustomAdapter extends BaseAdapter {
  13. private ArrayList mData = new ArrayList();
  14. private LayoutInflater mInflater;
  15. public MyCustomAdapter() {
  16. mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  17. }
  18. public void addItem(final String item) {
  19. mData.add(item);
  20. notifyDataSetChanged();
  21. }
  22. @Override
  23. public int getCount() {
  24. return mData.size();
  25. }
  26. @Override
  27. public String getItem(int position) {
  28. return mData.get(position);
  29. }
  30. @Override
  31. public long getItemId(int position) {
  32. return position;
  33. }
  34. @Override
  35. public View getView(int position, View convertView, ViewGroup parent) {
  36. System.out.println("getView " + position + " " + convertView);
  37. ViewHolder holder = null;
  38. if (convertView == null) {
  39. convertView = mInflater.inflate(R.layout.item1, null);
  40. holder = new ViewHolder();
  41. holder.textView = (TextView)convertView.findViewById(R.id.text);
  42. convertView.setTag(holder);
  43. } else {
  44. holder = (ViewHolder)convertView.getTag();
  45. }
  46. holder.textView.setText(mData.get(position));
  47. return convertView;
  48. }
  49. }
  50. public static class ViewHolder {
  51. public TextView textView;
  52. }
  53. }</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

ListView中convertView和ViewHolder的工作原理相关推荐

  1. Java中的Annotation(2)----Annotation工作原理

    上一篇文章已经介绍了如何使用JDK的三个标准Annotation,本文将介绍Annotation的原理,以及如何自定义Annotation,并利用Annotation来完成一些实际的功能. 定义Ann ...

  2. 关于SOCKET中send和recv函数工作原理总结

    send函数工作原理: send函数只负责将数据提交给网络协议层. 当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回SO ...

  3. 消解原理推理_什么是推理统计中的Z检验及其工作原理?

    消解原理推理 I Feel: 我觉得: The more you analyze the data the more enlightened, data engineer you will becom ...

  4. socket api中send()和recv()函数工作原理与要点

    send()和recv()函数是网络编程中经常使用到的函数,下面详细的比较两者的不同之处 send函数工作原理: send函数只负责将数据提交给协议层. 当调用该函数时,send先比较待发送数据的长度 ...

  5. 面试中问的话题Spring工作原理

    Spring工作原理 内部最核心的就是IOC了,  动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射  反射其实就是在运行时动态的去创建.调用对象,Spring就 ...

  6. 从一个案例看MVC中DataContext和UpdateModel的工作原理(详解UpdateModel/SubmitChanges错误)...

    昨天遇到一段棘手的程序,尝试了各种方法,忽而在SubmitChanges的时候没反应(无错误,也不更新),忽而发生ChangeConflict,经过几个小时,终于大致理清了思路,也顺便把DataCon ...

  7. zookeeper中展示所有节点_zookeeper工作原理与节点使用

    目录 zookeeper集群的搭建: 配置解释: 特点: 常规搭建方式,进行操作: A.关闭防火墙(测试环境) B.启动 服务,每个规划的 zookeeper 节点都要进行启动 C.启动客户端 D.命 ...

  8. Vue3中key的作用和工作原理

    这个key属性有什么作用呢?我们先来看一下官方的解释: key属性主要用在Vue的虚拟DOM diff算法中,在新旧nodes对比时辨识Vnodes: 如果不使用key,Vue会使用一种最大限度减少动 ...

  9. SAP Spartacus 中 Angular json pipe 的工作原理

    源代码如下: <ng-template cxOutletRef="header" cxOutletPos="before" let-jerryvar> ...

最新文章

  1. uniapp自定义导航栏
  2. rest项目的基础返回类设计
  3. springboot:映射静态资源路径
  4. Nginx打开目录浏览功能(autoindex)以及常见问题解决方案
  5. 软件测试用例_通用测试用例执行软件
  6. QUIC技术创新 让视频和图片分发再提速
  7. 分析方法的基础 — 3. 业务与管理的特性,分析与设计的抓手
  8. 我的第一句__asm 语句[很简单]
  9. L2-011. 玩转二叉树
  10. C#配置IIS搭建网站的工具类
  11. 3.8Python数据处理篇之Numpy系列(八)---Numpy的梯度函数
  12. iOS:SideTable
  13. 关于KL距离(KL Divergence)
  14. png图像保存为yuv格式以及yuv格式转为png
  15. eNSP初学者配置以太网2种链路端口:access、trunk
  16. Ubuntu 重置密码
  17. Java jdt 编辑_java – 如何使用JDT以编程方式重命名方法
  18. 心、肝、脾、肺、肾的毒藏在哪,你知道吗?
  19. WIN10系统设置默认文件查看方式
  20. jdk api 1.8 -中文版

热门文章

  1. 独家 | 一文读懂自然语言处理NLP(附学习资料)
  2. QTP提供的编程接口实现对QTP操作
  3. Angular属性型指令
  4. java 基本功 —— 内存相关
  5. 为Elasticsearch添加中文分词
  6. iOS开发篇——OC 协议和代理设计模式介绍
  7. centos 下安装配置nfs服务器
  8. Hibernate实体JSONObject化时遇到的问题
  9. 明白了为什么java方法上面为什么要加个@符号
  10. pandas操作sql数据库