Adapter的作用是界面与数据之间的桥梁,通过设置适配器至ListView控件后(如调用ListView的 setAdapter(ListAdapter adapter)
),列表的每一项会显示至页面中。其实,当列表里的每一项显示到页面时,都会调用Adapter的getView方法返回一个View,如:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return super.getView(position, convertView, parent);
}
CursorAdapter中提供了这两个抽象方法:
//Makes a new view to hold the data pointed to by cursor.
public abstract View newView(Context context, Cursor cursor, ViewGroup parent);
//Bind an existing view to the data pointed to by cursor
public abstract void bindView(View view, Context context, Cursor cursor);
newView和bindView细化了getView中的功能实现,均可写在getView中代替。
三者的调用顺序为:
getView——>newView——>bindView
转:http://hi.baidu.com/spare_h/blog/item/a826d9d873f7053410df9b52.html
ListView 中getView的原理
ListView 和 Adapter 的基础
工作原理:
ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。一个新的视图被返回并显示
如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能!
实际上Android为你缓存了视图。
Android中有个叫做Recycler的构件,下图是他的工作原理:

如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空 (null)的。当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了, 它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。
请看下面的示例代码,这里在getView中使用了System.out进行输出
| 01 |
publicclassMultipleItemsList extendsListActivity { |
| 03 |
privateMyCustomAdapter mAdapter; |
| 06 |
publicvoidonCreate(Bundle savedInstanceState) { |
| 07 |
super.onCreate(savedInstanceState); |
| 08 |
mAdapter = newMyCustomAdapter(); |
| 09 |
for(inti = 0; i < 50; i++) { |
| 10 |
mAdapter.addItem("item "+ i); |
| 12 |
setListAdapter(mAdapter); |
| 15 |
privateclassMyCustomAdapter extendsBaseAdapter { |
| 17 |
privateArrayList mData = newArrayList(); |
| 18 |
privateLayoutInflater mInflater; |
| 20 |
publicMyCustomAdapter() { |
| 21 |
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); |
| 24 |
publicvoidaddItem(finalString item) { |
| 26 |
notifyDataSetChanged(); |
| 35 |
publicString getItem(intposition) { |
| 36 |
returnmData.get(position); |
| 40 |
publiclonggetItemId(intposition) { |
| 45 |
publicView getView(intposition, 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 = newViewHolder(); |
| 51 |
holder.textView = (TextView)convertView.findViewById(R.id.text); |
| 52 |
convertView.setTag(holder); |
| 54 |
holder = (ViewHolder)convertView.getTag(); |
| 56 |
holder.textView.setText(mData.get(position)); |
| 62 |
publicstaticclassViewHolder { |
| 63 |
publicTextView textView; |
执行程序,然后在Logcat中查看日志
getView 被调用 9 次 ,convertView 对于所有的可见项目是空值(如下)
| 02-0513:47:32.559: INFO/System.out(947): getView 0null |
| 02-0513:47:32.570: INFO/System.out(947): getView 1null |
| 02-0513:47:32.589: INFO/System.out(947): getView 2null |
| 02-0513:47:32.599: INFO/System.out(947): getView 3null |
| 02-0513:47:32.619: INFO/System.out(947): getView 4null |
| 02-0513:47:32.629: INFO/System.out(947): getView 5null |
| 02-0513:47:32.708: INFO/System.out(947): getView 6null |
| 02-0513:47:32.719: INFO/System.out(947): getView 7null |
| 02-0513:47:32.729: INFO/System.out(947): getView 8null |
然后稍微向下滚动List,直到item10出现:

convertView仍然是空值,因为recycler中没有视图(item1的边缘仍然可见,在顶端)

| 02-0513:48:25.169: INFO/System.out(947): getView 9null |
再滚动List

convertView不是空值了!item1离开屏幕到Recycler中去了,然后item11被创建
| 02-0513:48:42.879: INFO/System.out(947): getView 10android.widget.LinearLayout@437430f8 |
再滚动:
| 02-0514:01:31.069: INFO/System.out(947): getView 11android.widget.LinearLayout@437447d0 |
| 02-0514:01:31.142: INFO/System.out(947): getView 12android.widget.LinearLayout@43744ff8 |
| 02-0514:01:31.279: INFO/System.out(947): getView 13android.widget.LinearLayout@43743fa8 |
| 02-0514:01:31.350: INFO/System.out(947): getView 14android.widget.LinearLayout@43745820 |
| 02-0514:01:31.429: INFO/System.out(947): getView 15android.widget.LinearLayout@43746048 |
| 02-0514:01:31.550: INFO/System.out(947): getView 16android.widget.LinearLayout@43746870 |
| 02-0514:01:31.669: INFO/System.out(947): getView 17android.widget.LinearLayout@43747098 |
| 02-0514:01:31.839: INFO/System.out(947): getView 18android.widget.LinearLayout@437478c0 |
| 02-0514:03:30.900: INFO/System.out(947): getView 19android.widget.LinearLayout@43748df0 |
| 02-0514:03:32.069: INFO/System.out(947): getView 20android.widget.LinearLayout@437430f8 |
convertView 如我们所期待的非空了,在item11离开屏幕之后,它的视图(@437430f8)作为convertView容纳item21了
ListView优化
http://blog.csdn.net/yucf1988/article/details/6365297
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
- 关于ListView中getView被重复调用的问题
我用ListView显示数据时,自定义了一个适配器(extends ArrayAdapter),然后重写了getView方法,现在出现一个问题,就是这个getView()方法被重复调用了,比如我的_d ...
- 转:ListView中getView的工作原理
ListView中getView的工作原理: [1]ListView asks adapter “give me a view” (getView) for each item of the list ...
- android开发 BaseAdapter中getView()里的3个参数是什么意思
BaseAdapter适配器里有个getView()需要重写public View getView(int position,View converView,ViewGroup parent){ // ...
- android ListView 中getview学习总结
最近在做android相关的开发,ListView中有一个图片错位的问题,今天查了很多人写的一些东西,所以记录下来,算是一种加深理解吧. ListView是一个非常常用的控件,功能可以扩展的很丰富,而 ...
- listview中getview异步加载网络图片
前言:本以为异步加载挺简单,因为网上代码多,但真想要做好,还真不那么简单,从看代码到弄懂再到自己写,实在是有太多的东西需要学了,用了两天的时间,终于弄出来了,因为用到回调函数,所以理解起来可能难度有点 ...
- [转][Android] ListView中getView的原理+如何在ListView中放置多个item
ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...
- Jquery中绑定事件的异同
谈论jquery中bind(),live(),delegate(),on()绑定事件方式 1. Bind() $(selector).bind(event,data,function) Event:必 ...
- ListView的adapter中getView方法一直调用
当ListView的高度不定(比如重写ListView搞成可自己主动的扩展的ListView)或 ListView嵌套在SrollView(高度不定)中,listView中的一个item元素改变会使得 ...
随机推荐
- LeetCode - 442. Find All Duplicates in an Array - 几种不同思路 - (C++)
题目 题目链接 Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ...
- wwnjld团队第二轮迭代成员分数
2014-01-05 第二轮迭代团队内成员分数如下(依据分数分配规则以及团队会议协商所得结果): 吴渊渊 23 汪仁贵 21.5 高小洲 19.5 聂建 22.5 吕家辉 23.5 程志 10
- DAY2敏捷冲刺
站立式会议 工作安排 (1)服务器配置 (2)数据库连接 (3)页面创意 燃尽图 代码提交记录 感想 林一心:centos配置服务器真的算是一个不小的坑,目前数据库配置清楚,脚本部署好明天测试交互,还 ...
- JDK源码分析 – ArrayList
ArrayList类的申明 ArrayList是一个支持泛型的,底层通过数组实现的一个可以存任意类型的数据结构,源码中的定义如下: public class ArrayList<E> ex ...
- .net平台借助第三方推送服务在推送Android,IOS消息(极光推送_V3版本)最新
最近刚从极光推送官网上看到V2版本要停用,不得不有重新写V3版本的.这里用到了 HTTP Basic Authentication http://www.cnblogs.com/pingming/p/ ...
- 3dContactPointAnnotationTool开发日志(三)
今天的目的是把obj文件导到场景里.具体将制定路径的obj文件导进去我用的是这个方法.导进去后呈现的是一个黑色的影子. 导入后还想实现一下缩放功能,请看这个方法.缩放实现起来也很简单. 光 ...
- YaoLingJump开发者日志(八)V1.1版本完成
跳跃吧瑶玲下载连接 官网下载(网站服务器不支持10M以上的文件上传-_-||) 百度网盘下载 介绍 忙里偷闲,把之前的工作整理了一下完成V1.1版本,下面是更新! (1)去掉了积分榜. (2)增加 ...
- 【Docker 命令】- build命令
docker build 命令用于使用 Dockerfile 创建镜像. 语法 docker build [OPTIONS] PATH | URL | - OPTIONS说明: --build-arg ...
- 【Asp.Net】IIS应用程序池添加ASP.NET v4.0
可能在安装.NET Framewrok 4.0之前,IIS就已经装好了,结果在IIS的应用程序池中只有.NET 2.0的Classic .NET AppPool和DefaultAppPool.在使用v ...
- 【周记:距gdoi43天】
这个星期切了几道题吧,虽然说还是想让自己搏一搏,但是毕竟自己弱嘛,而且很多东西都还没熟透&不像rausen大神都屠进前100了. 加油吧.