连接器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;
}
}
版权声明:本文博主原创文章,博客,未经同意不得转载。