Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >代码抽取(adapter)

代码抽取(adapter)

作者头像
六月的雨
发布于 2022-01-17 12:03:52
发布于 2022-01-17 12:03:52
33900
代码可运行
举报
文章被收录于专栏:Android开发指南Android开发指南
运行总次数:0
代码可运行

1 抽取Adapter 共性的方法

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

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

BaseHolder

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
10. 面向holder编程、自动轮询
没有看过上一篇文章的话,建议先去阅读GooglePlay:9.代码抽取(adapter) 项目框架的搭建: 以后每个view都是holder BaseHolder public abstract class BaseHolder<Data> {//写data和t一样 private View contentView; private Data data; protected BitmapUtils bitmapUtils; public BaseHolder(){ bitmapUtils
六月的雨
2018/05/14
7240
14.不同条目的listview
分类界面 整个项目的逻辑就是这样的 CategoryInfo public class CategoryInfo { private String title; private String u
六月的雨
2018/05/14
6230
3-VI--☆ListView的封装
零、前言 [1].第一次自己ListView封装时,封装的比较差,用起来不是很好用,虽然比起原生好很多 [2].第二次接触ListView封装是在慕课网hyman的课程,深深折服 [3].基于此思想,自己封装了RecyclerView ---- 一、使用 1.使用起来只要两步 public class Up3Activity extends AppCompatActivity { @BindView(R.id.lv) ListView mLv; private Array
张风捷特烈
2018/09/26
4690
笔记42 | Android加载器Adapter的深入学习篇(一)
地址 CSDN:http://blog.csdn.net/xiangyong_1521/article/details/78653538简书:http://www.jianshu.com/p/7bfd1eeea5cb ---- 目录 以ListView为例的工作原理 ViewHolder的作用 getItemViewType和getViewTypeCount 实现 实现步骤 ---- 1.ListView针对List中每个item, adapter都会调用一个getView的方法获得布局视图 2.我们一般
项勇
2018/06/19
6130
万能适配器
base-adapter Android 万能的Adapter for ListView,GridView等,支持多种Item类型的情况。 点击查看简单介绍 可以直接导入项目参考,在Android Studio中,使用Import Module进行导入,如下图: 单种类型Item listView.setAdapter(new CommonAdapter<Bean>(getActivity(), mDatas, R.layout.item_single_listview)
听着music睡
2018/05/18
7840
Android ListView优化之局部刷新(更新)(非notifyDataSetChanged)
3.activity中的代码 这里面用到了万能ViewHolder,不了解可以去这里 了解详情 同时也用到了万能适配器,不了解可以去这里 了解详情
程思扬
2022/01/10
2.5K0
Android ListView优化之局部刷新(更新)(非notifyDataSetChanged)
ViewStub的使用
ViewStub经常用在ListView中,用来隐藏一些操作,使用起来也很简单,主要就是在ListView的Item中通过一个ViewStub来引用被隐藏的布局文件。监听用户点击Item,判断下当前是可见还是不可见,实时进行状态的转换即可。
全栈程序员站长
2022/09/13
3530
ViewStub的使用
笔记41 | Android加载器Adapter的几个练习
合抱之木,生於毫末;九層之台,起於累土;千里之行,始於足下。《老子》 地址 简书:http://www.jianshu.com/p/bec0fdbb54ef csdn:http://blog.csdn.net/xiangyong_1521/article/details/78644437 ---- 目录 概念 ArrayAdapter SimpleAdapter BaseAdapter ---- 概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的V
项勇
2018/06/19
4920
Andriod基础——Adapter类
Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View,因为layout五花八门,很多数据都不能直接绑定上去,所以Android引入了Adapte
mukekeheart
2018/02/27
1.7K0
Andriod基础——Adapter类
ListView优化和列表首尾使用
前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪些方法技巧来优化ListView的效率。 一、使用convertView 前面讲的自定义ArrayAdapter和自定义BaseAdapter,都会重写getView()方法,虽然可以正常使用,但其实效率非常低。当列表项很多时,用户每次滚动屏幕,都会创建一批新的View对象,以填充新出现的列表项,这样势必会影响用户体验。 我们可以看到getView()方法中传入
分享达人秀
2018/02/02
1.5K0
ListView优化和列表首尾使用
Android ListView适配器应该这样写
ViewHolder缓存View的思路我们还是要继续沿用,但是我们希望ViewHolderHelper能够适用所有Adapter,而且我们希望它能有更强大功能,例如能够设置显示的文本,能够设置点击事件等。
三好码农
2018/09/11
5520
笔记43 | Android加载器Adapter的深入学习篇(二)
地址 csdn:http://blog.csdn.net/xiangyong_1521/article/details/78656841 简书:http://www.jianshu.com/p/abb
项勇
2018/06/19
6390
Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表
codingblock
2017/12/29
2.1K0
Android项目开发全程(四)-- 将网络返回的json字符串轻松转换成listview列表
Android开发:ListView、AdapterView、RecyclerView全面解析
AdapterView本身是一个抽象类,AdapterView及其子类的继承关系如下图:
Carson.Ho
2019/02/22
3.5K0
4-VI--☆ListView的封装支持多种条目
更多安卓技术欢迎访问:https://www.jianshu.com/c/004f3fe34c94
张风捷特烈
2018/08/29
4100
ListView-1(包括常用属性和方法)「建议收藏」
在vakues里建立一个arrays.xml文件,为listview提供数据,也可以写在string.xml文件里
全栈程序员站长
2022/09/07
6740
Android架构之路-三步实现MVP架构(下)
对于项目分包,有的人喜欢根据功能分包,也有人喜欢根据组件或者模块进行分包。分包原则:使得项目结构清晰,功能明确,便于查询与后期维护。具体看个人爱好,没有严格规定,大家先看一张我分包后的项目结构:
开发者技术前线
2020/11/23
5030
Android架构之路-三步实现MVP架构(下)
相关推荐
10. 面向holder编程、自动轮询
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验