适配器模式常见情况如安卓的自定义界面。最初学习安卓时自定义listView或者gridView时就用过适配器。但是一直没有好好理解。用如下案例理解一下:
package com.listview;
import java.util.List;
import com.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class CardTradeAdapter extends ArrayAdapter<CardTrade> {
private int resourceId;
// 适配器的构造函数,把要适配的数据传入这里
public CardTradeAdapter(Context context, int textViewResourceId, List<CardTrade> objects){
super(context,textViewResourceId,objects);
resourceId=textViewResourceId;
}
// convertView 参数用于将之前加载好的布局进行缓存
@Override
public View getView(int position, View convertView, ViewGroup parent){
CardTrade cardTrade=getItem(position); //获取当前项的Fruit实例
// 加个判断,以免ListView每次滚动时都要重新加载布局,以提高运行效率
View view;
ViewHolder viewHolder;
if (convertView==null){
// 避免ListView每次滚动时都要重新加载布局,以提高运行效率
view=LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
// 避免每次调用getView()时都要重新获取控件实例
viewHolder=new ViewHolder();
viewHolder.name=(TextView)view.findViewById(R.id.name_txt);
viewHolder.cardno=(TextView)view.findViewById(R.id.cardno_txt);
viewHolder.amount=(TextView)view.findViewById(R.id.amount_txt);
viewHolder.time=(TextView)view.findViewById(R.id.time_txt);
// 将ViewHolder存储在View中(即将控件的实例存储在其中)
view.setTag(viewHolder);
} else{
view=convertView;
viewHolder=(ViewHolder) view.getTag();
}
// 获取控件实例,并调用set...方法使其显示出来
viewHolder.name.setText(cardTrade.getName());
viewHolder.amount.setText(cardTrade.getAmount());
viewHolder.cardno.setText(cardTrade.getCardno());
viewHolder.time.setText(cardTrade.getTime());
return view;
}
// 定义一个内部类,用于对控件的实例进行缓存
class ViewHolder{
public TextView name;
public TextView cardno;
public TextView time;
public TextView amount;
}
}
用一个小需求再详细理解一下适配器模式。
比如某个车厂有A款和B款两种suv 在车型底盘相差不大的情况下。生产B型车时想用A型车生产线。但是需要修改一些小的设置。这时候我们就需要将生产线做适配
public class ACar { String getProdLine(){ return "A型车的生产线"; } } public interface BCar { String getProdLine(); }
public class BCarAdapter implements BCar{ private ACar aCar; BCarAdapter(){ } BCarAdapter(ACar aCar){ this.aCar = aCar; } @Override public String getProdLine() { String acarline = aCar.getProdLine(); //通过技术手段。转换成B型车特点的生产线 String bCarLine = "B型车的生产线"; return bCarLine; } }
/**** * 车厂 */ public class CarFactory { public String productionCar(BCar bCar){ System.out.println("bcar===>" + bCar.getProdLine()); return bCar.getProdLine(); } }
public static void main(String[] args) { BCar bCar =new BCarAdapter(new ACar()); CarFactory carFactory = new CarFactory(); carFactory.productionCar(bCar); }