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;
		}
		
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货

安卓开发_浅谈ListView(自定义适配器)

2946
来自专栏Android开发指南

9.indicate、xutils、json

36813
来自专栏向治洪

解决ListView嵌套ListView遇到的问题

Listview嵌套会造成的问题主要是子listview的高度错误导致内容不能正常显示完,解决这个问题,我个人第一个想法就是重新计算子listview的高度,代...

1996
来自专栏along的开发之旅

<Android编程权威指南>之1.6 Activity.this和this的区别

也就是说,直接在监听器View.OnClickListener里使用this,代表的是创建的这个匿名类,也就是实现了View.OnClickListener接口...

693
来自专栏mukekeheart的iOS之旅

onclicklistener到底怎么用?

相信很多像我一样的新手学习Android开发会遇到这个问题,通过这几天的归类和总结,将我的理解写在下面,欢迎大家一起前来讨论: 以按钮BUTTON的监听事件为例...

3926
来自专栏向治洪

android RecycleView Adapter简单封装

早些时候我们使用系统提供个的BaseAdapter的时候为了满足大家的需要,我们总会对BaseAdapter做一层上层的封装,然后对于实际业务我们只需要关心ge...

2808
来自专栏Android干货

安卓开发_深入理解Activity和Fragment的关系

45313
来自专栏james大数据架构

列表选择Spinner

1.只用XML配置来显示列表 在res\values中添加一个arrays.xml 1 <?xml version="1.0" encoding="utf-8...

20610
来自专栏java初学

android入门 — ListView的优化

35313
来自专栏项勇

笔记15 | 归纳总结Android动态设置TextView的颜色的四种方法

1664

扫码关注云+社区