4 把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder
DefaultAdapter类
public abstract class DefaultAdapter<T> extends BaseAdapter {
private List<T> datas;
public DefaultAdapter(List<T> datas){
this.datas=datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
//convertView 划出屏幕的view对象
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder<T> holder;
if(convertView==null){
holder=getHolder();
}else{
holder=(BaseHolder<T>)convertView.getTag();
}
T string = datas.get(position);
//holder.refreshView(string);
holder.setData(string);
return holder.getContentView();
}
protected abstract BaseHolder<T> getHolder();
}public abstract class BaseHolder<T> {
protected View contentView;
protected T data;
public BaseHolder(){
contentView=initView();
contentView.setTag(this); // 在这个位置设置的标签
}
public void setData(T data) {
this.data=data;
refreshView(data);
}
/**
* 当Holder中的view对象显示到界面上的时候调用
* @return
*/
public View getContentView() {
return contentView;
}
/**
* 当setData调用的时候 会调用该方法 根据数据 显示界面
*/
protected abstract void refreshView(T data);
/**
* 初始化View对象 及其控件
* @return
*/
protected abstract View initView();
}使用:最后只需要实现holder中的两个方法即可
lv.setAdapter(new MainAdapter(datas));
private class MainAdapter extends DefaultAdapter<String>{
public MainAdapter(List<String> datas) {
super(datas);
// TODO Auto-generated constructor stub
}
@Override
protected BaseHolder<String> getHolder() {
return new MainHolder();
}
}
class MainHolder extends BaseHolder<String>{
private TextView tv;
// 当执行new MainHolder() 会调用该方法
@Override
protected void refreshView(String data) {
this.tv.setText(data);
}
@Override
protected View initView() {
View view=View.inflate(getApplicationContext(), R.layout.item_main, null);
this.tv=(TextView) view.findViewById(R.id.tv);
return view;
}
}/** 根据位置 判断当前条目是什么类型 */
/** 当前ListView 有几种不同的条目类型 */
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; // 2 有两种不同的类型
}
@Override
public int getItemViewType(int position) { //20
if (position == datas.size()) { // 当前是最后一个条目
return MORE_ITEM;
}
return getInnerItemViewType(position); // 如果不是最后一个条目 返回默认类型
}
private int getInnerItemViewType(int position) {
return DEFAULT_ITEM;
}
复用时可参考如下调用
BaseHolder holder = null;
switch (getItemViewType(position)) { // 判断当前条目时什么类型
case MORE_ITEM:
if(convertView==null){
holder=getMoreHolder();
}else{
holder=(BaseHolder) convertView.getTag();
}
break;
default:
if (convertView == null) {
holder = getHolder();
} else {
System.out.println("aaa");
holder = (BaseHolder) convertView.getTag();
}
if (position < datas.size()) {
holder.setData(datas.get(position));
}
break;
}
return holder.getContentView(); // 如果当前Holder 恰好是MoreHolder 证明MoreHOlder已经显示原文:http://blog.csdn.net/gaobaoshen1/article/details/51354765