国外的书,读起来就是有点拗口。看的是Android4中文。上面把Adapter介绍的很详细,不过不够中国化。
Adapter介绍
Adapter用来把数据绑定到扩展了AdapterView类的视图组(ListView或Gallery),Adapter负责创建代表所绑定父类视图中的底层数据库的子视图。【简单的说就是为ListView或Gallery中加载子视图,视图就是控件】
【别人的图,很清晰的表达了这个意思:Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。】
【这个图,也很清楚的表现了所有的原生的Adapter】
原生的Adapter介绍
在很多情况下,都不需要从头创建自己的Adapter。Android提供了一个Adapter集,用于从公共数据库(包括数据和游标)来像扩展了AdapterView的原生控件提供数据。
因为Adapter即负责提供数据,又负责创建代表每一条目的的视图,所以Adapter可以从根本上修改他们所绑定的控件的外观和功能。
- ArrayAdapter:ArrayAdapter使用泛型来来把Adapter视图绑定到一个指定类的对象的数组。默认情况下,ArrayAdapter使用数组中每个对象的toString值来创建和填充文本视图。
- SimpleCursorAdapter:SimpleCursorAdapter可以把一个布局中的视图和游标的特定绑定到一起。【这个不是很了解先不介绍了】
制定ArrayAdapter
默认情况下,ArrayAdapter使用数组中每个对象的toString值来创建和填充文本视图。
在大多数情况下,需要制定ArrayAdapter来填充每个视图使用的布局,以表示底层的数组数据。为此,要使用特定类型的变体来扩展ArrayAdapter,并重写getView方法来向布局视图分配对象属性。
public class MyArrayAdapter extends ArrayAdapter<User>{
int resource;
public MyArrayAdapter(Context context, int resource,
List<User> objects) {
super(context, resource, objects);
this.resource = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建并填充要显示的视图
LinearLayout newView;
if(convertView == null){
//如果不是一次更新,则填充一个新视图
newView = new LinearLayout(getContext());
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater li;
li = (LayoutInflater)getContext().getSystemService(inflater);
li.inflate(resource, newView,true);
}else{
//否则更新现有的视图
newView = (LinearLayout)convertView;
}
User user = getItem(position);
return super.getView(position, convertView, parent);
}
}
getView方法用于构造、填充将添加到父AdapterView类(如ListView)中的视图,该父Adapterview类使用这个Adapter绑定到底层的数组。
getVIew方法的参数描述了要显示的条目的位置,要更新的视图,以及将包含这个形新视图的视图组。调用getItem将返回存数在底层数组的指定索引位置的值。
这个方法将返回新创建并填充的视图实例,或者更新的视图实例。
使用Adapter绑定数据到视图
要把一个Adapter应用到一个有AdapterVIew派生的类中,可以调用视图的setAdapter方法,并传递给他一个Adapter实例,如下
ArrayList<String> myStringArray = new ArrayList<String>();
int layoutId = android.R.layout.simple_list_item_1;
ArrayAdapter<String> myAdapterInstance;
myAdapterInstance = new ArrayAdapter<String>(getContext(), layoutId , myStringArray);
myListView.setAdapter(myAdapterInstance);
还有一些别的Adapter的的子类,他们的用法有所不同,到时候用到了在写。