Android类库--与Adapter相关的类
来源:互联网 发布:淘宝没有指纹支付选项 编辑:程序博客网 时间:2024/06/08 01:30
<一>Adapter
Class Overview
An Adapter object acts as a bridgebetween an AdapterView
and the underlying datafor that view. The Adapter provides access to the data items. TheAdapter is also responsible for making aView
for each item in the data set.
下图直观的表达了适配器视图,适配器及底层数据三者的关系:
下面以两种视图方式展现Adapter继承层次关系:
适配器视图的层次关系图:
Adapter方法和域:
由于所有的适配器皆由Adapter派生而来,所以最好对Adapter的每一个方法有所了解.
为了避免产生大量的View浪费内存,在Android中,AdapterView中的View是可回收的使用的。比如你有100项数据要显示,而你的屏幕一次只能显示10条数据,则只产生10个View,当往下拖动要显示第11个View时,会把第1个View的引用传递过去,更新里面的数据再显示,也就是说View可重用,只是更新视图中的数据用于显示新的一项,如果一个视图的视图类型是IGNORE_ITEM_VIEW_TYPE的话,则此视图不会被重用
static final int IGNORE_ITEM_VIEW_TYPE =AdapterView.ITEM_VIEW_TYPE_IGNORE;
注册一个Observer,当Adapter所表示的数据改变时会通知它,DataSetObserver是一个抽象类,定义了两个方法:onChanged与onInvalidated
void registerDataSetObserver(DataSetObserverobserver);
取消注册一个Observer
void unregisterDataSetObserve
返回Adapter所代表的数据集的数据项总数.
int getCount();
返回指定位置的数据项
Object getItem(int position);
返回指定位置的数据项的ID,大部分适配器数据项ID等于数据项位置,且ID随数据项的增删可变,但CursorAdapter及其子类除外。
long getItemId(int position);
表示所有数据项的ID是否是稳定不变的,在BaseAdapter中默认返回了false,假设是不稳定的,在CursorAdapter中返回了true,Cursor中的_ID是不变的
boolean hasStableIds();
为每一个数据项产生相应的视图对象
View getView(int position, View convertView, ViewGroupparent);
获得指定位置的视图对象的类型,使用一个整数来表示视图对象的类型,如果一个视图对象通过getView()方法可以被转化成另一个视图对象,那么这两个视图对象应该使用同一个类型。比如ArrayAdapter的getItemViewType()返回0,表示所有视图对象都是可重用的,即可以由另一个视图转化而来。
int getItemViewType(int position);
返回的视图类型的数量。即getView()方法可以返回多少种类型的视图对象。(在HeaderViewListAdapter中可以包含Header和Footer,getView可以返回Header、Footer及Adapter中的视图,但其getViewTypeCount的实现只是调用了内部Adapter的的getViewTypeCount,忽略了Header、Footer中的ViewType)
int getViewTypeCount();
判断Adapter是否不包含任何数据。该方法典型的实现是:returngetCount() == 0.但getCount()可以包括headers和footers,故在特殊的Adapter中该方法的可以有不同的实现.
boolean isEmpty();
<二>ListAdapter
Class Overview
Extended Adapter
thatis the bridge between a ListView
and the datathat backs the list. Frequently that data comes from a Cursor, butthat is not required. The ListView can display any data providedthat it is wrapped in a ListAdapter.
常用方法:
接口ListAdapter的方法大部分方继承自Adapter,相比Adapter只增加了两个用于ListView分栏效果的方法:
指示是否Adapter所有数据项都是使能的,如果true,则意味着所有的数据项都是可选中和单击的。但如果改方法的返回值会随时间而改变,则无法保证该方法会起作用.
abstract boolean areAllItemsEnabled()
如果指定位置的数据项不是分栏符则应该返回true,(分栏符是指不能被选中和点击的数据项),如果传进来的position参数是一个无效的参数,应该抛出一个
ArrayIndexOutOfBoundsException
异常.abstract boolean isEnabled(int position)
这两个API主要是用来实现适配器视图的分栏效果,即将列表分成多个类别,如上图所示将人名分为"男","女"两类,通过重写这两个Api可将男,女所在菜单项设为不能被选中(unselectable)和点击(unclicked).
<三>SpinnerAdaper
Class Overview
Extended Adapter
thatis the bridge between a Spinner
and its data. Aspinner adapter allows to define two different views: one thatshows the data in the spinner itself and one that shows the data inthe drop down list when the spinner is pressed.
Spinner
与底层数据之间的桥梁。SpinnerAdapter允许定义两种不同的视图,其中一种视图用于在spinner自身中显示数据项,另一种视图用于当spinner被按下时弹出的下拉列表中显示数据项.也因此SpinnerAdapter增加了一个方法getDropDownView().常用方法:
接口SpinnerAdaper的方法大部分方继承自Adapter,相比AdapterSpinnerAdaper只增加了getDropDowmView()方法。
该方法产生用于spinner下拉项的视图
abstract View getDropDownView(intposition, View convertView,ViewGroup parent)
<四>BaseAdapter
Class Overview
Common base class of commonimplementation for an Adapter
that can be usedin bothListView
(by implementing thespecialized ListAdapter
interface} andSpinner
(by implementing the specializedSpinnerAdapter
interface.
BaseAdapter是一个抽象类,是所有适配器的基类,基于BaseAdapter实现的适配器既可以用于ListView(通过实现ListAdapter接口)也可以用于Spinner(通过实现SpinnerAdapter接口).
类BaseAdapter对ListAdapter接口和SpinnerAdapter接口中的某些方法做了默认实现,其实现细节如下:
public abstractclass BaseAdapter implements ListAdapter, SpinnerAdapter {
}
由上可知,BaseAdapter将getView(),getItem(),getCount(),getItemId()四个方法留给了开发者来实现.接下来开始讨论具体的Adapter
<五>ArrayAdapter
类ArrayAdapter是一个具体的BaseAdapter,其对应的底层数据可以是任意类型的数组或List类型的集合,默认情况下该类期望提供的一个布局文件,该布局文件仅仅只包含一个TextView.你也可以指定一个Layout并指定该布局文件中一个类型为TextView的资源的ID.
默认情况下,ArrayAdapter为每一个数据项生成一个TextView视图对象,并将数据项toString()方法返回的值作为TextView内容.如果想使用其它的视图对象来显示数据项,比如ImageView又或则想显示除数据项toString()方法返回值以外的数据,可以通过覆写getView()方法.
构造器:
public ArrayAdapter(Context context, int textViewResourceId){
}
public ArrayAdapter(Context context, int resource, inttextViewResourceId) {
}
public ArrayAdapter(Context context, int textViewResourceId, T[]objects) {
}
public ArrayAdapter(Context context, int resource, inttextViewResourceId, T[] objects) {
}
public ArrayAdapter(Context context, int textViewResourceId,List<T> objects) {
}
public ArrayAdapter(Context context, int resource, inttextViewResourceId, List<T> objects){
}
最多有4个参数,分别为当前Context,layout(可省),TextView的资源ID与数据(可为数组或List),在构造函数中都调用了一个叫init的函数
private void init(Context context, int resource, inttextViewResourceId, List<T> objects){
分别赋值给类中的私有域,mInflater为LayoutInflater,产生相应项的视图。
类中有两个域保存数据
private ArrayList<T>mOriginalValues;
private List<T> mObjects;
其中mOriginalValues用于过滤数据时保存过滤前的数据,将过滤后的数据存入mObjects。
在ArrayAdapter中还定义了add,insert,remove,clear函数用于改变数据,并定义了一个布尔变量mNotifyChange用于表示用这些函数改变数据后是否通知视图(调用notifyDataSetChanged,调用这个函数时会把mNotifyChange置为true。
一些函数的实现:
public int getCount() {
}
public T getItem(int position) {
}
public int getPosition(T item) {
}
public long getItemId(int position) {
}
public View getView(int position, View convertView, ViewGroupparent) {
}
public View getDropDownView(int position, View convertView,ViewGroup parent) {
}
可以看到getView和getDropDownView都通过调用createViewFromResourse来产生视图。
private View createViewFromResource(int position, View convertView,ViewGroup parent,