码迷,mamicode.com
首页 > 其他好文 > 详细

BaseAdapter 抽取

时间:2016-05-12 22:40:10      阅读:151      评论:0      收藏:0      [点我收藏+]

标签:

1  抽取Adapter 共性的方法
2  把getView方法里 和holder相关的逻辑 摘取到Holder代码中
3  把Holder 相关的代码 抽取到BaseHolder中 

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();

}

BaseHolder

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 ,在defaultadapter中添加如下方法
/** 根据位置 判断当前条目是什么类型 */

		/** 当前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已经显示



BaseAdapter 抽取

标签:

原文地址:http://blog.csdn.net/gaobaoshen1/article/details/51354765

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!