其实这里的复用技术在列表中是十分常见的,iphone中的tableView也有相关的技术,cell的复用

工作原理:

  1. ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。
  2. 一个新的视图被返回并显示

如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!

实际上Android为你缓存了视图。

Android中有个叫做Recycler的构件,下图是他的工作原理:

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

请看下面的示例代码,这里在getView中使用了System.out进行输出

public class MultipleItemsList extends ListActivity {private MyCustomAdapter mAdapter;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mAdapter = new MyCustomAdapter();for (int i = 0; i < 50; i++) {mAdapter.addItem("item " + i);}setListAdapter(mAdapter);}private class MyCustomAdapter extends BaseAdapter {private ArrayList mData = new ArrayList();private LayoutInflater mInflater;public MyCustomAdapter() {mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);}public void addItem(final String item) {mData.add(item);notifyDataSetChanged();}@Overridepublic int getCount() {return mData.size();}@Overridepublic String getItem(int position) {return mData.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {System.out.println("getView " + position + " " + convertView);ViewHolder holder = null;if (convertView == null) {convertView = mInflater.inflate(R.layout.item1, null);holder = new ViewHolder();holder.textView = (TextView)convertView.findViewById(R.id.text);convertView.setTag(holder);} else {holder = (ViewHolder)convertView.getTag();}holder.textView.setText(mData.get(position));return convertView;}}public static class ViewHolder {public TextView textView;}
}

android开发--ListView中的getView原理相关推荐

  1. android开发-Listview中显示不同的视图布局

    在重写ListView的BaseAdapter时,我们常常在getView()方法中复用convertView,以提高性能.convertView在Item为单一的同种类型布局时,能够回收并重用,但是 ...

  2. android开发 listview 头部 轮播,listview添加的头部布局超过一屏头部内容显示不全...

    headView的实际高度超过一个屏幕,但是显示的结果只有一个屏幕,超过一个屏幕高度意外的部分显示不全. 只使用了listView.getRefreshable().addHeadView(headV ...

  3. Android在ListView中嵌套一个GridView时只显示一行的原因及解决方法

    在之前的编程里,我还没有遇到过要在一个ListView中嵌套一个GridView或是在一个GridView中嵌套一个ListView.所以今天事儿来了!我花了一将近3个小时,找到了为什么我在一个Lis ...

  4. Android 动态刷新listview中的数据

    之前一直困扰listview刷新后位置的问题,现在才明白,原来不能重新设置listview的adapter,而应该用notifyDataSetChanged()来刷新,这样位置就不会置顶. 下面做了一 ...

  5. 42.Android之ListView中ArrayAdapter简单学习

    今天学习下Android中ListView关于ArrayAdapter数据绑定, 废话少说直接上代码. 改下布局文件: 1 <?xml version="1.0" encod ...

  6. Android 关于ListView中按钮监听的优化问题(方法二)

    关于ListView中按钮监听的优化问题(方法一)地址: http://www.cnblogs.com/steffen/p/3951901.html 之前的方法一,虽然能够解决position的传递, ...

  7. Android处理ListView中的Item中的Button按钮不能点击的问题

    问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...

  8. android onitemclicklistener 参数,android – 对listview中的项使用setOnItemClickListener

    大家好,有一个应用程序,可以在SD卡上保存音频.我创建了一个listview,它从sdcard中检索文件名.我正在尝试设置一个监听器,所以当单击文件名时,我可以启动另一个播放该文件的意图.当我尝试设置 ...

  9. Android开发应该了解的Binder原理,分享PDF高清版

    正文 Android行业主要问题是初级Android太多了,会写xml和Activity的程序员太多了,初中级程序员面临很大的竞争,现状也就偏于高级开发者.越来越多的初中级Android程序员找不到满 ...

最新文章

  1. Nginx之简介与安装(一)
  2. 无法创建文件系统以及无法创建PV时怎么办?
  3. java测试工程师需要掌握什么_测试工程师需不需要了解开发知识?
  4. CSDN公式编辑(latex语言应用)整理
  5. JavaScript toLocaleString()时间转化为字符串
  6. 荣耀20青春版能升鸿蒙吗,荣耀20青春版上手 配置跑分如何
  7. php 连接socket服务器_PHP-Socket服务端客户端发送接收通信实例详解
  8. pip下载安装与环境配置
  9. CentOS7.2 在线安装MySQL8.0
  10. Python中Selenium设置无界面访问
  11. 计算机操作系统(汤小丹)慕课版课后题答案第五章:储存器管理
  12. AP 微积分 第12版 第4章参考答案
  13. 普通java类注入dao失败_spring mvc 整合mybatis dao接口注入失败
  14. (知乎)男生 25 岁了,应该明白哪些道理?
  15. android studio 顶部菜单栏消失了如何恢复
  16. 计算机开机错误怎么办,电脑开机蓝屏错误代码0X0000007E怎么办?
  17. python read_csv函数_Python pandas.read_csv()函数
  18. 走近Palantir
  19. 猫云bootcdn.cn
  20. Openlayers:Polygon绘图工具

热门文章

  1. 分栏报表-物品清单报表实现
  2. python开源项目及示例代码
  3. 如何获取js对象的对象名
  4. Linux下查看Apache的版本号
  5. IE9(测试版)浏览器实用快捷键使用方法
  6. WinForm经典窗体皮肤[重绘]
  7. 我要放弃RedHat Linux了
  8. Go 语言——Tensorflow
  9. 数据库查询的数据导出到xls表,集合数据导出到xls表
  10. navicat 连接oracle