9.代码抽取(adapter)


1  抽取Adapter 共性的方法

2  把getView方法里 和holder相关的逻辑 摘取到Holder代码中
3  把Holder 相关的代码 抽取到BaseHolder中 
4  把adapter 中getVIew 方法 抽取到了DefaultAdpater中, 其中每个子类getView方法中holder不太一样,所以定义了抽象方法getHolder 要求子类去实现holder

  •  BaseHolder 所有holder的基类
  •  DefaultAdapter 所有adapter 的基类
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对象显示到界面上的时候调用,即getview返回这个
	 * @return
	 */
	public View getContentView() {
		return contentView;
	}
	/**
	 * 当setData调用的时候 会调用该方法  根据数据 显示界面
	 */
	protected abstract void refreshView(T data);
	/**
	 * 初始化View对象 及其控件
	 * @return
	 */
	protected abstract View initView();
}
子类只需要填充数据和设置控件显示的数据就可以

  

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;//和adapter的泛型一样
		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();
}

 

MainActivity
public class MainActivity extends Activity {
	private ListView lv;
	private List<String> datas;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		datas=new ArrayList<String>();
		for(int i=0;i<100;i++){
			datas.add("aabbbcc"+i);
		}
		
		lv=(ListView) findViewById(R.id.lv);
		lv.setAdapter(new MainAdapter(datas));
		
	}
	public void click(View v){
		Intent intent=new Intent(getApplicationContext(), SecondActivity.class);
		startActivity(intent);
		
	}
	
	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;
		// 在adapter里list.get(position),然后调用了holer的setdate,而setdata调用了refresh,这样就把data传过来了
		@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;
		}
	}
}

  

SecondActivity
public class SecondActivity extends Activity {
	private ListView lv_second;
	private List<Drawable> datas;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_second);
		lv_second=(ListView) findViewById(R.id.lv_second);
		datas=new ArrayList<Drawable>();
		for(int i=0;i<100;i++){
			Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
			datas.add(drawable);
		}
		
		
		lv_second.setAdapter(new SecondAdapter(datas));
	}
	private class SecondAdapter extends DefaultAdapter<Drawable>{
		public SecondAdapter(List<Drawable> datas) {
			super(datas);
		}
		@Override
		protected BaseHolder<Drawable> getHolder() {
			return new SecondHolder();
		}
	}
	class SecondHolder  extends BaseHolder<Drawable>{
		
		ImageView iv;
		@Override
		protected void refreshView(Drawable data) {
			iv.setImageDrawable(data);
		}
		@Override
		protected View initView() {
			View view=View.inflate(getApplicationContext(), R.layout.item_second, null);
			this.iv=(ImageView) view.findViewById(R.id.iv);
			return view;
		}
		
	}
}

  



posted @ 2015-11-16 16:28  梦和远方  阅读(248)  评论(0编辑  收藏  举报