前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码抽取(adapter)

代码抽取(adapter)

作者头像
六月的雨
发布2022-01-17 20:03:52
3350
发布2022-01-17 20:03:52
举报
文章被收录于专栏:Android开发指南

1 抽取Adapter 共性的方法

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

  • BaseHolder 所有holder的基类
  • DefaultAdapter 所有adapter 的基类

BaseHolder

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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;
		}
		
	}
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-11-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档