Android通用适配器CommonAdapter

1、刚完成一个小项目,项目中有多个页面,其中包含了许多ListView和GridView,避免不了要写很多的Adapter,当时就像那么多重复的代码,若是抽取一下就好了,由于时间紧迫,没有来得及抽取,刚好前几天看到慕课上《打造万能适配器》,本文算是对该视频的学习记录,按照自己的方式,对视频中的代码进行了稍稍的改动,废话说多了,下面进入主题…
2、Demo源码:http://download.csdn.net/detail/gonghao2014/9704384

1、普通方式

注:这里只给出关键部分代码

//类似ListView这样的视图,继承BaseAdapter实现ListView的适配器类
public class ListViewAdapter extends BaseAdapter {private Context mContext;private List<Bean> mBeans;public ListViewAdapter(Context context, List<Bean> beans) {this.mContext = context;this.mBeans = beans;}@Overridepublic int getCount() {return mBeans.size();}@Overridepublic Object getItem(int position) {return mBeans.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(R.layout.item_grid_view, parent, false);}ViewHolder viewHolder = (ViewHolder) convertView.getTag();if (viewHolder == null) {viewHolder = new ViewHolder();convertView.setTag(viewHolder);}viewHolder.img = (ImageView) convertView.findViewById(R.id.id_img);viewHolder.title = (TextView) convertView.findViewById(R.id.id_title);Bean bean = mBeans.get(position);viewHolder.img.setImageResource(bean.getImgId());viewHolder.title.setText(bean.getTitle());return convertView;}class ViewHolder {ImageView img;TextView title;}
}
//当一个项目中类似这样的ListView和GridView多了以后,会发现要写很多个Adapter类,并且代码很多是重复的
//比如说:Context字段、List<Bean>实体数据字段、构造方法、getCount()、getItem()、getItemId()

1、仔细观察后发现,其实每个Adapter类中,最大的不同点就是用户看到的视图(childView),和视图中填充的数据
2、所以就想,能抽象一个转化方法–convert(视图Id,该视图的显示数据)
3、两个参数:视图Id(viewId)和该视图要显示的数据(bean.getXX())
4、写一个抽象类CommonAdapter,让需要使用的Adapter继承CommonAdapter类,重写其中的convert方法即可

2、抽取方式

第一步:新建一个CommonAdapter类,代码如下

/*** 通用适配器类* @author HaoG* @param <T>*            要填充的数据类型*/
public abstract class CommonAdapter<T> extends BaseAdapter {private Context mContext; //上下文对象,LayoutInflater加载布局时用到private List<T> mBeans; //视图要显示的数据的集合private int mLayoutId; //要显示的视图所在的布局的IDpublic CommonAdapter(Context context, List<T> beans, int layoutId) {this.mContext = context;this.mBeans = beans;this.mLayoutId = layoutId;}@Overridepublic int getCount() {return mBeans.size();}@Overridepublic Object getItem(int position) {return mBeans.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(mContext).inflate(mLayoutId,parent, false);}//这里是一个转换器类,下面详细介绍Convertor convertor = Convertor.get(convertView);//根据上面的想法,抽取出来的抽象方法convert()convert(convertor, mBeans.get(position));return convertView;}/*** 使用转换器convertor,将数据bean显示在相对应View上* 具体的视图和数据的适配依据需求而定,所以具体的实现要交个子类去实现* @param convertor* @param bean*/public abstract void convert(Convertor convertor, T bean);
}

第二步:新建一个Convertor类,代码如下

/*** 转换器类 封装了一个ViewHolder(即mViews)* * @author HaoG*/
public class Convertor {private View mConvertView;private SparseArray<View> mViews;// viewHolderpublic Convertor(View convertView) {mViews = new SparseArray<View>();this.mConvertView = convertView;}/*** 获取convertor实例* * @param convertView* @return*/public static Convertor get(View convertView) {Convertor convertor = (Convertor) convertView.getTag();if (convertor == null) {convertor = new Convertor(convertView);convertView.setTag(convertor);}return convertor;}/*** 根据viewId获取View视图实例* * @param viewId* @return*/@SuppressWarnings("unchecked")private <T extends View> T getView(int viewId) {View childView = mViews.get(viewId);if (childView == null) {childView = mConvertView.findViewById(viewId);mViews.put(viewId, childView);}return (T) childView;}/*** 给指定viewId的TextView控件设置文本* * @param viewId* @param text* @return*/public Convertor setText(int viewId, String text) {TextView tv = getView(viewId);tv.setText(text);//返回值是Convertor类的对象本身是为了代码的书写方便,可以链式书写,下面可以看到链式书写形式return this;}/*** 给指定viewId的ImageView控件设置图片* * @param viewId* @param imgId* @return*/public Convertor setImageResource(int viewId, int resId) {ImageView iv = getView(viewId);iv.setImageResource(resId);return this;}// PS:// 类似setText(),setImageResource()方法,可根据需求自行添加// 如Item视图中含有RadioButton控件,那个可以添加setChecked()方法}

第三步:根据业务需求,新建一个CommonAdapter的子类–ListViewAdapter类,代码如下

/*** ListView适配器类* * @author HaoG**/
public class ListViewAdapter3 extends CommonAdapter<ListBean> {public ListViewAdapter3(Context context, List<ListBean> beans, int layoutId) {super(context, beans, layoutId);}/*** 1、在这里我们可以看到子类中只需要实现其convert()方法即可* 2、在Convertor类中,已经封装的相关的接口,在这里直接调用即可*/@Overridepublic void convert(Convertor convertor, ListBean bean) {convertor.setImageResource(R.id.id_img, bean.getImgId()).setText(R.id.id_title, bean.getTitle());}
}

3、结语

1、到这里基本就结束了,如果有不太懂的地方,可以去慕课,观看《打造Android万能适配器》
2、这里并不是打广告,我也是Android初学者,在写项目时多个Adapter感到繁琐,刚好碰到这个通用的CommonAdapter,便记录下学习小结,愿与君共进步…
3、感谢《慕课网–打造万能适配器》

Android通用适配器CommonAdapter相关推荐

  1. 【Android开发】自定义ListView,使用通用适配器,并实现ListView上的每一项和每一项上的按钮等控件同时监听

    ListView在Android开发中是比较常用的系统组件,但是有时候我们除了需要做ListView上每一行的点击监听事件之外,如果每一行上还有其他需要监听的控件例如Button.CheckBox等, ...

  2. Android适配器以及作用,Android RecyclerView 通用适配器的实现

    分析 我们需要在RecyclerViewAdapter内部维持一个数据集合的引用 需要实现Item的点击事件,包括短按和长按,并需要向外部提供设置监听器的方法 这个适配器必须通用,所以应该是泛型的,并 ...

  3. android怎么设置适配器,Android之自定义实现BaseAdapter(通用适配器三)

    在上一篇中,我们说过,在setData中如果有很多控件的话,我们还是要在该方法中写入很多代码,为了降低开发的方便性,本次就在此基础上再一次优化.实现原理是这样的,每次在setData中都要查找控件,然 ...

  4. Android RecyclerView简单通用适配器

    一直都想写一个通用的RecyclerView适配器,但是一直都无从下手,后来看了鸿洋大神的博客后才知道怎么写,并且在此基础上添加了点自己的东西,终于算是大功告成.先上代码看看 public class ...

  5. android中适配器,android:打造万能通用适配器

    本文原创,转载请注明出处. 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广大安卓开发者需要掌握和优化的技巧. 本文旨在介绍一个通用的适配器BaseCommAdapter写 ...

  6. Android:打造万能通用适配器

    原文地址:http://blog.csdn.net/q649381130/article/details/51781921 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广 ...

  7. Android进阶笔记09:Android 万能适配器

    1. Android 万能适配器      项目中Listview GridView几乎是必用的组件,Android也提供一套机制,为这些控件绑定数据,那就是Adapter.用起来虽然还不错,但每次都 ...

  8. Android通用的搜索框

    之前项目总会遇到很多搜索框类的功能,虽然不是很复杂,不过每次都要去自己处理数据,并且去处理搜索框的变化,写起来也比较麻烦,今天来做一个比较简单的通用搜索栏. 先看下效果图: 没什么特别的,只是今天要做 ...

  9. 15类Android通用流行框架

    15类Android通用流行框架 Android流行框架 缓存 DiskLruCache Java实现基于LRU的磁盘缓存 图片加载 Android Universal Image Loader 一个 ...

  10. android中的标题栏是什么意思,Android通用标题栏组合控件

    原标题:Android通用标题栏组合控件 快,点击蓝色"字体"关注这个公众号,一起涨姿势 由于项目中经常用到此种组合控件,就封装了下,具体效果看下图,老司机可以绕道哈! 一.主要功 ...

最新文章

  1. 怎么中断一个ajax请求,ajax、fetch、axios如何中断请求?
  2. 服务器光盘修复读不出盘,求助,硬盘读不出来怎么修复?
  3. 牛客网 【每日一题】5月20日题目 简单瞎搞题
  4. shiro学习(3):用户权限
  5. [2017.3.29]中国生育腚理不互质
  6. 想成长为一名年薪50万+的实战型架构师?必掌握这7大实战技能经验
  7. php imagick 取得psd缩略图,PHP中使用Imagick操作PSD文件实例
  8. xmpp服务器linux,Prosody搭建xmpp服务器
  9. java计算机毕业设计农田节水灌溉监测系统源码+程序+lw文档+mysql数据库
  10. 免费的XMind思维脑图在线编辑的网站, 可打开 .pos 文件
  11. 实验二 数字类型及其操作(新)
  12. 清理Maven仓库冗余文件(lastUpdated、m2e-lastUpdated.properties、空文件夹)脚本
  13. 自动生成目录和参考文献上标
  14. Python os.listdir()函数用法介绍
  15. 1至9填入九个方框内_把19这九个数字填在方框里
  16. 深入浅出matplotlib(99):散点图里自定义标记显示
  17. CF1661D Progressions Covering
  18. 简单易用:两种在线抠图人像方法,让你摆脱PS操作困扰!
  19. 完整的门店CRM客户管理系统原型设计
  20. Mavicat连接mysql关闭防火墙_连接navicat的一些问题 主要是防火墙

热门文章

  1. 29.Go异常处理-recover
  2. 什么音频剪辑软件好用?
  3. 原生js写简易别踩白块儿
  4. 【美团校招在线考试笔试题】钱币面值组合
  5. 我是怎么打开车库门的:ASK/OOK手动解码及重放
  6. 使用gimp批量处理图片
  7. 电脑知识与技术杂志电脑知识与技术杂志社电脑知识与技术编辑部2022年第15期目录
  8. newton插值公式
  9. java设计模式之-策略模式
  10. 【记录一些名人博客地址】