如果一个项目当中需要定义多个Adapter,那么重复的编写一些相同的代码无意是繁琐和浪费时间的,所以BaseListAdapter就产生了,当需要自定义Adapter的时候,让这个Adapter继承BaseListAdapter,只需覆写bindView(int position, View convertView, ViewGroup parent)方法即可,另外,可以通过setOnInViewClickListener(Integer key,onInternalClickListener onClickListener)方法来为Adapter里的view添加点击事件,当然,也可以直接通过setOnClickListener(listener)为view设置点击事件。
<span style="font-size:18px;">@SuppressLint("UseSparseArrays")
public abstract class BaseListAdapter<E> extends BaseAdapter {
public List<E> list;
public Context mContext;
public LayoutInflater mInflater;
public List<E> getList() {
return list;
}
public void setList(List<E> list) {
this.list = list;
notifyDataSetChanged();
}
public void add(E e) {
this.list.add(e);
notifyDataSetChanged();
}
public void addAll(List<E> list) {
this.list.addAll(list);
notifyDataSetChanged();
}
public void remove(int position) {
this.list.remove(position);
notifyDataSetChanged();
}
public void clear() {
this.list.clear();
notifyDataSetChanged();
}
public BaseListAdapter(Context context, List<E> list) {
super();
this.mContext = context;
this.list = list;
mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
if(null==list)return 0;
return list.size();
}
@Override
public E getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public View getView(int position, View convertView, ViewGroup parent) {
convertView = bindView(position, convertView, parent);
addInternalClickListener(convertView, position, list.get(position));
return convertView;
}
public abstract View bindView(int position, View convertView,
ViewGroup parent);
public Map<Integer, onInternalClickListener> canClickItem;
private void addInternalClickListener(final View itemV, final Integer position,final Object valuesMap) {
if (canClickItem != null) {
for (Integer key : canClickItem.keySet()) {
View inView = itemV.findViewById(key);
final onInternalClickListener inviewListener = canClickItem.get(key);
if (inView != null && inviewListener != null) {
inView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
inviewListener.OnClickListener(itemV, v, position,
valuesMap);
}
});
}
}
}
}
public void setOnInViewClickListener(Integer key,
onInternalClickListener onClickListener) {
if (canClickItem == null)
canClickItem = new HashMap<Integer, onInternalClickListener>();
canClickItem.put(key, onClickListener);
}
public interface onInternalClickListener {
public void OnClickListener(View parentV, View v, Integer position,
Object values);
}
}</span>
示例代码:
覆写bindView(int position, View convertView, ViewGroup parent)方法
<span style="font-size:18px;">@Override
public View bindView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(null==convertView){
convertView=mInflater.inflate(R.layout.it_busroute,null);
}
TextView tv=ViewHolder.get(convertView,R.id.bue_routetime);//ViewHolder类的介绍
Button btn=ViewHolder.get(convertView,R.id.bue_routename);
ImageView iv=ViewHolder.get(convertView,R.id.bue_routedist);
/*
* 通过list.getItem(position)来获取一个内容item
* 然后从item里取出相应内容给view设置上
*/
return convertView;
}</span>