listView的工作原理

listview的基本元素:

参考网址:http://blog.csdn.net/ocean181/article/details/7170735

ListView是将数据以列表的形式展现出来,由三个元素组成:viewadapterdata,关系图如下

 

1.View,列表的显示形式由一个xml所指定的。一般是在每个item需要显示的时候即在getView函数中通过Inflater.inflate(R.layout.XXX,  null)来加载进来,一般在一个listview中所有的item显示的样式都是一样的,如果想要在同一个list中加载不同风格的item,可以通过重写父类函数getItemViewType(int position)让在不同positionitem返回不同的type,然后在getview()中通过不同的type去加载不同的layout,从而达到同一个listview中显示不同styleitem

2.adapter,用来将不同的数据映射到View上。不同的数据对应不同的适配器,如ArrayAdapterCursorAdapter, SimpleAdapter等,他们能够将数组,指针指向的数据,Map等数据映射到View上。也正是由于适配器的存在,使得ListView的使用相当灵活,经过适配器的处理后,在 view看来所有的数据映射过来都是一样的。android中adapter的继承关系如下:

3.data,就是listview真正要显示的数据,数据内容可以是字符串,图片等,数据通过不同形式存储然后通过适配器将数据显示到 ListView上。所有的数据和资源要显示到ListView上都通过适配器来完成。

 

Listview的绘制过程:

参考网址: http://mobile.51cto.com/abased-410889.htm

ListView 针对每个item,要求 adapter“返回一个视图” (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这个长度,调用getView()一行一行的绘制ListView的每一项。如果你的getCount()返回值是0的话,列表一行都不会显示,如果返回1,就只显示一行。返回几则显示几行。如果我们有几千几万甚至更多的item要显示怎么办?为每个Item创建一个新的View?不可能!!!实际上Android早已经缓存了这些视图,大家可以看下下面这个截图来理解下,这个图是解释ListView工作原理的最经典的图了大家可以收藏下,不懂的时候拿来看看,加深理解,其实Android中有个叫做Recycler的构件,顺带列举下与Recycler相关的已经由Google做过N多优化过的东东比如:AbsListView.RecyclerListenerViewDebug.RecyclerTraceType等等,要了解的朋友自己查下,不难理解,下图是ListView加载数据的工作原理。

 

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

 

posted on 2015-06-05 10:08  kma  阅读(153)  评论(0编辑  收藏  举报

导航