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 {
02   
03     privateMyCustomAdapter mAdapter;
04   
05     @Override
06     publicvoidonCreate(Bundle savedInstanceState) {
07         super.onCreate(savedInstanceState);
08         mAdapter = newMyCustomAdapter();
09         for(inti = 0; i < 50; i++) {
10             mAdapter.addItem("item "+ i);
11         }
12         setListAdapter(mAdapter);
13     }
14   
15     privateclassMyCustomAdapter extendsBaseAdapter {
16   
17         privateArrayList mData = newArrayList();
18         privateLayoutInflater mInflater;
19   
20         publicMyCustomAdapter() {
21             mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
22         }
23   
24         publicvoidaddItem(finalString item) {
25             mData.add(item);
26             notifyDataSetChanged();
27         }
28   
29         @Override
30         publicintgetCount() {
31             returnmData.size();
32         }
33   
34         @Override
35         publicString getItem(intposition) {
36             returnmData.get(position);
37         }
38   
39         @Override
40         publiclonggetItemId(intposition) {
41             returnposition;
42         }
43   
44         @Override
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);
53             } else{
54                 holder = (ViewHolder)convertView.getTag();
55             }
56             holder.textView.setText(mData.get(position));
57             returnconvertView;
58         }
59   
60     }
61   
62     publicstaticclassViewHolder {
63         publicTextView textView;
64     }
65 }

执行程序,然后在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

CursorAdapter中getView newView bindView异同的更多相关文章

  1. 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同

    在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...

  2. 关于ListView中getView被重复调用的问题

    我用ListView显示数据时,自定义了一个适配器(extends ArrayAdapter),然后重写了getView方法,现在出现一个问题,就是这个getView()方法被重复调用了,比如我的_d ...

  3. 转:ListView中getView的工作原理

    ListView中getView的工作原理: [1]ListView asks adapter “give me a view” (getView) for each item of the list ...

  4. android开发 BaseAdapter中getView()里的3个参数是什么意思

    BaseAdapter适配器里有个getView()需要重写public View getView(int position,View converView,ViewGroup parent){ // ...

  5. android ListView 中getview学习总结

    最近在做android相关的开发,ListView中有一个图片错位的问题,今天查了很多人写的一些东西,所以记录下来,算是一种加深理解吧. ListView是一个非常常用的控件,功能可以扩展的很丰富,而 ...

  6. listview中getview异步加载网络图片

    前言:本以为异步加载挺简单,因为网上代码多,但真想要做好,还真不那么简单,从看代码到弄懂再到自己写,实在是有太多的东西需要学了,用了两天的时间,终于弄出来了,因为用到回调函数,所以理解起来可能难度有点 ...

  7. [转][Android] ListView中getView的原理+如何在ListView中放置多个item

      ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView). 一个新的视图被返回并显示 如果 ...

  8. Jquery中绑定事件的异同

    谈论jquery中bind(),live(),delegate(),on()绑定事件方式 1. Bind() $(selector).bind(event,data,function) Event:必 ...

  9. ListView的adapter中getView方法一直调用

    当ListView的高度不定(比如重写ListView搞成可自己主动的扩展的ListView)或 ListView嵌套在SrollView(高度不定)中,listView中的一个item元素改变会使得 ...

随机推荐

  1. c++容器 STL

    2019-01-24 22:30:32 记录学习PAT的一些知识,有待更新 注:本文是对Algorithm 算法笔记 的总结 C++标准库模板(Standard Template Library,ST ...

  2. Sql server在cmd下的使用

    方法一 在DOS提示符下,c:\>isql -U sa -P (此处输入SA密码) 注----大小写敏感 回车后会出现"1>"提示符,表明已成功,此时可在DOS下做任何 ...

  3. javascript打开新窗口

    一.window.open()支持环境: JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二.基本语法: window.open(pageURL,name, ...

  4. jquery中的$(document).ready()、JavaScript中的window.onload()以及body中的onload()、DomContentLoaded()区别

    $().ready().$(handler).$(document).ready(handler)均不是原生JS中的,都是jQuery中封装的方法.这些事件在当页面的dom节点加载完毕后就执行,无需等 ...

  5. php分页类的实现与调用 (自我摘记)

    page.class.php <?php namespace Component; class Page { private $total; //数据表中总记录数 private $listRo ...

  6. Python练习—函数

    1.编写函数f(n),实现输入n的值,求出n的阶乘.然后调用此函数计算1! +2!+3!+……10!的结果,输出到屏幕上. def f(n): count = 1; for i in range(1, ...

  7. lintcode-148-颜色分类

    148-颜色分类 给定一个包含红,白,蓝且长度为 n 的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数 0,1 和 2 分别代表红,白,蓝. 注意事项 ...

  8. PAT L1-044 稳赢

    https://pintia.cn/problem-sets/994805046380707840/problems/994805086365007872 大家应该都会玩“锤子剪刀布”的游戏:两人同时 ...

  9. linux+Nginx+Mysql+PHP环境下,安装mysqli模块

    奶奶的腿儿啊,太不易了.倒腾了小半天儿,写此随笔,待后查. 阿里云ecs中,安装phpcms,出现了一个问题:环境检测的时候,一直提示 Mysqli扩展没开启. 老夫哪儿特么会这么专业的啊...能咋办 ...

  10. Ubuntu 删除多余内核

    Ubuntu 删除多余内核 转载▼ 首先查询当前我们使用的是内核是那个版本别删错了. uname -a 第二: 查询系统中装了多少内核 dpkg --get-selections|grep linux ...