转自:http://www.eoeandroid.com/thread-228482-1-1.html
适配器模式
把一个类的接口转换为客户端所期待的另一种接口,从而使原本因接口不匹配而无法再一起工作的两个类能够在一起工作。
又称为:转化器模式、变压器模式或包装模式。
通俗的来说,就像我们平常给笔记本用的充电器一样,不管外接电源是110V、220V还是360V,经过充电器的转化后,输出给笔记本的都是标准而稳定的12V电压。
----------------------------------------------------------------------------------
Android API中的应用:
ListView与Adapter的应用就是典型的适配器模式。
如:
- //----------------------------------------------------------------------------------------------声明组件
- //绑定Layout里面的ListView
- ListView list = (ListView) findViewById(R.id.ListView01);
- //----------------------------------------------------------------------------------------------设置数据源
- //生成动态数组,加入数据
- ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
- for(int i=0;i<10;i++)
- {
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("ItemImage", R.drawable.checked);
- map.put("ItemTitle", "Level "+i);
- listItem.add(map);
- }
- //----------------------------------------------------------------------------------------------导入数据源
- //生成适配器的Item和动态数组对应的元素
- SimpleAdapter adapter = new SimpleAdapter(this,listItem,
- R.layout.list_items,[size=1em] [size=1em]
- new String[] {"ItemImage","ItemTitle"},
- new int[] {R.id.ItemImage,R.id.ItemTitle,R.id.ItemText}
- );
- //----------------------------------------------------------------------------------------------适配
- //添加并且显示
- list.setAdapter(adapter);
这是我们在 Android 开发 中常用的构造一个ListView组件的方法,对于大家来说异常的熟悉,不用废话了。
----------------------------------------------------------------------------------
举例说明
下面就以ListView为样例来剖析一下他的工作原理:
结构如下:
第一步:构建BaseAdapter抽象父类
public abstract class BaseAdapter {
public String[] item; //ListView 中的子项Item
public String[] getItem() {
return item;
}
public void setItem(String[] item) {
this.item = item;
}
}
----------------------------------------------------------------------------------
第二步:定义ListView方法的接口IListView
public interface IListView {
public void setAdapter(BaseAdapter adapter);
}
----------------------------------------------------------------------------------
第三步:ListView组件类
public class ListView extends BaseAdapter implements IListView{
@Override
public void setAdapter(BaseAdapter adapter) {
this.setItem(adapter.getItem());
}
}
至此ListView组件已经成型,接下来完成适配器Adapter类
----------------------------------------------------------------------------------
第四步:适配器接口IAdapter
public interface IAdapter { public void setData();
}
----------------------------------------------------------------------------------
第五步:生成适配器SimpleAdapter
public class SimpleAdapter extends BaseAdapter implements IAdapter{
ArrayList<HashMap< String,String>> arrayList;
String name;
public SimpleAdapter(ArrayList<HashMap< String,String>> arrayList,String name) {
this.arrayList=arrayList;
this.name=name;
this.item=new String[arrayList.size()];
setData();
}
@Override
public void setData() {
for(int i=0;i<arrayList.size();i++){
this.item=arrayList.get(i).get(name);
}
}
}
----------------------------------------------------------------------------------
Ok,创建类结束!
应用:
ListView listView=new ListView();
ArrayList<HashMap< String,String>> arrayList=new ArrayList<HashMap<String,String>>();
for(int i=0;i<10;i++){
HashMap<String,String> map=new HashMap<String, String>();
map.put("NAME", "Item"+i);
arrayList.add(map);
}
SimpleAdapter adapter1=new SimpleAdapter(arrayList, "NAME");
listView.setAdapter(adapter1);
----------------------------------------------------------------------------------
适配器模式设计原则:
1.使用对象组合,面向接口和抽象编程(万年不变)
2.“开闭”原则
使用场合:
1.软件系统结构需要升级或扩展,又不想影响原有的系统的稳定运行的时候;
2.转换类之间的差别不是太大的时候;
3.想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类协同工作时候。
总结:
其实样例中的ListView与SimpleAdapter都是继承了抽象父类BaseAdapter,这是完成“适配”、能够传递数据的根本原因。接口则定义逻辑规则。