相信有Android开发经验的同仁,开发项目时写ListView、GridView的适配器最多,并且做得都是重复的工作,这就要求我们对适配器进行封装。
下面我就直接贴上代码了,布局文件都一个样,我就不贴了。
/**
* 通用适配器(Universal BaseAdapter)
*
* 1、第二个构造方法:ArrayAdapter源码构造方法写法
* 2、同时适配器增加了添加数据、移除数据等方法
*
* @author linvisf
*
* @param <T>
*/
public abstract class UBaseAdapter<T> extends BaseAdapter {
private Context context;
private List<T> list;
//提供两种常用数据源的构造方法
public UBaseAdapter(Context context, List<T> list){
this.context = context;
this.list = list;
}
public UBaseAdapter(Context context, T[] dataArray){
this.context = context;
this.list = Arrays.asList(dataArray);
}
@Override
public int getCount() {
if (list != null)
return list.size();
return 0;
}
@Override
public T getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
/**返回item布局的resource id*/
public abstract int getItemLayoutResId();
public abstract View bindView(View convertView, int position, ViewHolder holder);
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (null == convertView) {
convertView = View.inflate(context, getItemLayoutResId(), null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return bindView(convertView, position, holder);
}
/**
* ViewHolder
* @author linvisf
*/
public class ViewHolder {
private SparseArray<View> views = new SparseArray<View>();
private View convertView;
public ViewHolder(View convertView) {
this.convertView = convertView;
}
@SuppressWarnings({ "unchecked", "hiding" })
public <T extends View> T getView(int resId) {
View v = views.get(resId);
if (null == v) {
v = convertView.findViewById(resId);
views.put(resId, v);
}
return (T) v;
}
}
public List<T> getList(){
return list;
}
public void add(T t){
list.add(t);
notifyDataSetChanged();
}
public void addAll(List<T> t){
list.addAll(t);
notifyDataSetChanged();
}
public void set(T oldT, T newT){
set(list.indexOf(oldT), newT);
}
public void set(int index, T t){
list.set(index, t);
notifyDataSetChanged();
}
public void remove(T t){
list.remove(t);
notifyDataSetChanged();
}
public void remove(int index){
list.remove(index);
notifyDataSetChanged();
}
public boolean contains(T t){
return list.contains(t);
}
}
以上代码就是通用适配器工具,下面是如何调用我们通用适配器:
a、写在目标activity部分代码
//使用ArrayList<T> 和数组数据源一样,只是构造方法不同而已
String[] mDatas = new String[]{"android", "ios","java","web","sqlite","javascript"};
SimpleListAdapter adapter = new SimpleListAdapter(this, mDatas);
ListView mListView = (ListView) findViewById(R.id.listview1);
mListView.setAdapter(adapter);
b、写个适配器SimpleListAdapter 继承UBaseAdapter,如下:
public class SimpleListAdapter extends UBaseAdapter<String> {
//如果是List数据源,则使用SimpleListAdapter(Context context, List<String> list)
public SimpleListAdapter(Context context, String[] dataArray) {
super(context, dataArray);
}
@Override
public int getItemLayoutResId() {
return R.layout.item_pop;
}
@Override
public View bindView(View convertView, int position, ViewHolder holder) {
//适配器布局中有多少个控件,都调用ViewHolder.getView(id)即可
TextView tv_label = holder.getView(R.id.tv_label);
tv_label.setText(getItem(position));
return convertView;
}
}
到此Android通用适配器写完,如那里写得不好,请大家多多见谅、指正。