标签:
1 抽取Adapter 共性的方法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