Android学习 --- Adapter
2012-03-08 23:30
134 查看
Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:
ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.
根据数据来源形式的不同可以选择不同的Adapter,比如数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用CursorAdapter, SimpleCursorAdapter
ListView中的每个Item是如何获取到的,先看一段国外网站截取的描述,学习自http://android.amberfog.com/?p=296:
(1) ListView asks adapter “give me a view” (getView) for each item of the list.(通过getView来获取每个item)
(2) A new View is returned and displayed(获取到后返回显示)
当写自己的Adapter时,需要继承相应基类BaseAdapter,如果需要获取多少个View,将会调用getView()多少次,而getView()通过getCount()来确定需要获取的View次数。而getView中有一个View参数convertView,它是Android为我们提供的缓存机制,例如,每个item都是通过getView来返回显示的,但当item数量很多,屏幕容纳的item数量有限,那么重复创建这么多View对象来显示显然是不合理。因此,Android提供了Recycler,将没有正在显示的item放进RecycleBin,然后在显示新视图时从RecycleBin中复用这个View。
Recycler的工作原理大致如下:
假设屏幕最多能看到11个item,那么当第1个item滚出屏幕,这个item的View进入RecycleBin中,第12个要出现前,通过getView从回收站(RecycleBin)中重用这个View,然后设置数据,而不必重新创建一个View。工作示意图如下:
转一个问题,可能出现getView多次调用的问题:
什么时候需要那创建相应Adapter的子类?
如果每一行的布局没有那么简单,例如:
并不是每一行都使用相同的布局(可能某些行包含一行文本,而其他行包含两行文本)
需要在行里面使用部件(不同情况下使用不同的图标)
ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.
根据数据来源形式的不同可以选择不同的Adapter,比如数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用CursorAdapter, SimpleCursorAdapter
ListView中的每个Item是如何获取到的,先看一段国外网站截取的描述,学习自http://android.amberfog.com/?p=296:
(1) ListView asks adapter “give me a view” (getView) for each item of the list.(通过getView来获取每个item)
(2) A new View is returned and displayed(获取到后返回显示)
当写自己的Adapter时,需要继承相应基类BaseAdapter,如果需要获取多少个View,将会调用getView()多少次,而getView()通过getCount()来确定需要获取的View次数。而getView中有一个View参数convertView,它是Android为我们提供的缓存机制,例如,每个item都是通过getView来返回显示的,但当item数量很多,屏幕容纳的item数量有限,那么重复创建这么多View对象来显示显然是不合理。因此,Android提供了Recycler,将没有正在显示的item放进RecycleBin,然后在显示新视图时从RecycleBin中复用这个View。
Recycler的工作原理大致如下:
假设屏幕最多能看到11个item,那么当第1个item滚出屏幕,这个item的View进入RecycleBin中,第12个要出现前,通过getView从回收站(RecycleBin)中重用这个View,然后设置数据,而不必重新创建一个View。工作示意图如下:
class MyAdapter extends BaseAdapter { //需要有构造函数 //需要重载,这个将被用来确定getView的调用次数 public int getCount(); //需要重载,getView将使用它来获取列表中指定位置的对象 public Object getItem(int position); //需要重载,用来为每一个item返回显示视图,当屏幕未满屏时,convertView将为null,而当超出满屏时,convertView将会复用已有的View public View getView(int position, View convertView, ViewGroup parent); }
转一个问题,可能出现getView多次调用的问题:
最近做项目发现一个界面当有ListView是,getView和getCount中的log被疯狂调用。一个5个Item的ListView,getView竟然会被反复调用7组。尤其是当ItemView中需要加载图片时,很容易造成GC过多,很容易出现ANR。 原因就在于measure过程,ListView一般都会有好多个Item,而且也会同时显示若干组Item,这些Item的父元素都是这个ListView。 更具Google的解释,View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两个参数后就开始layout,最后再是draw的调用。 对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。 而为什么会有很多组次调用呢? 问题就在于在layout中的决定ListView或者它的父元素的height和width属性的定义了。fill_parent会好一点,计算方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。 所以,解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。 |
如果每一行的布局没有那么简单,例如:
并不是每一行都使用相同的布局(可能某些行包含一行文本,而其他行包含两行文本)
需要在行里面使用部件(不同情况下使用不同的图标)
相关文章推荐
- android学习摘记——自定义Adapter的心得
- Android万能适配器Adapter-android学习之旅(74)
- 2014-10-25Android学习--------SimpleAdapter的实现
- 关于学习android中v4包中PagerAdapter实现引导页效果
- Android开发学习之路-自定义ListView(继承BaseAdapter)
- Android学习之Adapter(适配器)源代码分析与观察者模式的运用(一)
- Android学习之listView显示下拉列表(2)(SimpleAdapter适配器)
- android学习摘记——自定义Adapter的心得
- Android编码学习之Adapter
- Android 适配器Adapter的学习
- Android学习----自定义Adapter实现ListView
- Android学习四、Android中的Adapter
- Android适配器Adapter学习
- Android学习4、Android该Adapter
- Android适配器Adapter学习
- Android学习四、Android中的Adapter
- Android适配器Adapter学习
- SimpleAdapter和Baseadapter填充listActivity-android学习之旅()
- Android学习四、Android中的Adapter
- android学习日记18--Adapter简介