适配器在android中非常的常用,像ListView,GridView,下拉框。。。中都比较常用,
这篇博客介绍一个万能的适配器,虽然比较简单,但是用处比较大。(不用一个个再去创建适配器了)
此列子创建的是一个虚类,使用的时候需要继承此类,并实现相应的方法。
public abstract class SimpleBaseAdapter<T> extends BaseAdapter{
//调用类传入的Context
Context context
//需要的数据,使用泛型;
List<T> data;
//构造方法,传入context和数据
public SimpleBaseAdapter(Context context, List<T>data){
this.context = context;
this.data = data == null ? new ArrayList<T>() : data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
if(position >= data.size())
{
return null;
}
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//继承类所需要实现的方法,获取列表项的布局id
public abstract int getItemRsouce();
//继承类所需要实现的方法,获取列表项的view
public abstract View getItemView(int position,View convertView,ViewHolder holder);
//适配器中最重要的方法,之所以返回view调用getItemView()这个方法
//是因为返回的view中的子view需要根据实现类中view的id确认
@SuppressWarnings("unchecked")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if(convertView == null) {
convertView = View.inflate(context, getItemRsouce(), null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
return getItemView(position, convertView, holder);
}
//一种新的ViewHolder的写法,之所以这么写,是为了方便
//实现类获取ConvertView中的子view ,HolderView的缓存机制
//使用SparseArray进行缓存
public class ViewHolder{
private SparseArray<View> views = new SparseArray<View>();
private View convertView;
public ViewHolder(View convertView) {
this.convertView = convertView;
}
@SuppressWarnings("unchecked")
public <T extends View> T getView(int resId) {
View v = views.get(resId);
if(v == null) {
v = convertView.findViewById(resId);
views.put(resId, v);
}
return (T) v;
}
}
}
SimpleBaseAdapter其实就是对适配器的一种抽象,并且这个抽象类的不同表现用抽象方法
实现,因为实现类必须要实现抽象方法(也可以说实现类是根据抽象方法表现出不同的属性)
SimpleBaseAdapter的实现类:
public class myAdapter extends SimpleBaseAdapter<String> {
public myAdapter(Context context,List<String> data){
super(context, data);
}
@Override
public int getItemRsouce() {
return R.layout.list_item; //返回次实现类的列表item的xml文件id
}
//根据id获取view(每个实现类的id都不一样)
@Override
public View getItemView(final int position, View convertView, ViewHolder holder) {
TextView tv = holder.getView(R.id.title);
tv.setText((String) getItem(position));
Button btn = holder.getView(R.id.btn);
btn.setText("选择");
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(myAdapter.this.context, "" + position, Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
}