ListView的万能适配器:

https://github.com/JoanZapata/base-adapter-helper

首先介绍QuickAdapter.VH的实现:

static class VH extends RecyclerView.ViewHolder{private SparseArray<View> mViews;private View mConvertView;private VH(View v){super(v);mConvertView = v;mViews = new SparseArray<>();}public static VH get(ViewGroup parent, int layoutId){View convertView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);return new VH(convertView);}public <T extends View> T getView(int id){View v = mViews.get(id);if(v == null){v = mConvertView.findViewById(id);mViews.put(id, v);}return (T)v;}public void setText(int id, String value){TextView view = getView(id);view.setText(value);}
}

其中的关键点在于通过SparseArray<View>存储item view的控件,getView(int id)的功能就是通过id获得对应的View(首先在mViews中查询是否存在,如果没有,那么findViewById()并放入mViews中,避免下次再执行findViewById())。

QuickAdapter的实现如下:

public abstract class QuickAdapter<T> extends RecyclerView.Adapter<QuickAdapter.VH>{private List<T> mDatas;public QuickAdapter(List<T> datas){this.mDatas = datas;}public abstract int getLayoutId(int viewType);@Overridepublic VH onCreateViewHolder(ViewGroup parent, int viewType) {return VH.get(parent,getLayoutId(viewType));}@Overridepublic void onBindViewHolder(VH holder, int position) {convert(holder, mDatas.get(position), position);}@Overridepublic int getItemCount() {return mDatas.size();}public abstract void convert(VH holder, T data, int position);static class VH extends RecyclerView.ViewHolder{private SparseArray<View> mViews;private View mConvertView;private VH(View v){super(v);mConvertView = v;mViews = new SparseArray<>();}public static VH get(ViewGroup parent, int layoutId){View convertView = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false);return new VH(convertView);}public <T extends View> T getView(int id){View v = mViews.get(id);if(v == null){v = mConvertView.findViewById(id);mViews.put(id, v);}return (T)v;}public void setText(int id, String value){TextView view = getView(id);view.setText(value);}}
}

其中:

  • getLayoutId(int viewType)是根据viewType返回布局ID。
  • convert()做具体的bind操作。

就这样,万能适配器实现完成了。

通过万能适配器能通过以下方式快捷地创建一个Adapter:

mAdapter = new QuickAdapter<String>(data) {@Overridepublic int getLayoutId(int viewType) {return R.layout.item;}@Overridepublic void convert(VH holder, String data, int position) {holder.setText(R.id.text, data);//holder.itemView.setOnClickListener(); 此处还可以添加点击事件}
};

是不是很方便。当然复杂情况也可以轻松解决。

mAdapter = new QuickAdapter<Model>(data) {@Overridepublic int getLayoutId(int viewType) {switch(viewType){case TYPE_1:return R.layout.item_1;case TYPE_2:return R.layout.item_2;}}@Overridepublic int getItemViewType(int position) {if(position % 2 == 0){return TYPE_1;} else{return TYPE_2;}}@Overridepublic void convert(VH holder, Model data, int position) {int type = getItemViewType(position);switch(type){case TYPE_1:holder.setText(R.id.text, data.text);break;case TYPE_2:holder.setImage(R.id.image, data.image);break;}}
};

List列表的万能的适配器相关推荐

  1. listview-android:打造万能通用适配器(转)

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

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

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

  3. 第7天 Recyclerview万能的适配器(基本使用、分割线、增加删除动画)

    第7天 Recyclerview万能的适配器(基本使用.分割线.增加删除动画) Recyclerview的使用 思路 代码 Recyclerview的使用 用了很长一段时间的RecyclerView, ...

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

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

  5. android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter

    我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...

  6. 高级控件——列表类视图——基本适配器BaseAdapter

    =================================================================== 第一个页面布局: <LinearLayout xmlns: ...

  7. 万能ExpandableListAdapter适配器

    转载请声明:http://blog.csdn.net/yoyo_newbie/article/details/50350975 源码下载地址:https://github.com/Sam4748506 ...

  8. Android万能适配器BaseRecyclerViewAdapterHelper的简单使用

    继我们上一章的网络请求的封装中,我们在现有的项目中通过我们的万能适配器来写一个简单的Recyclerview列表 效果图 video1 首先还是同样的道理,我们需要进行一个简单的依赖添加 //recy ...

  9. RecyclerView超级万能适配器(多布局、head、foot、下拉刷新、上拉自动更多、滑动删除)

    使用方法 GitHub APK下载 将libray模块复制到项目中,或者直接在build.gradle中依赖: allprojects {repositories {maven { url 'http ...

最新文章

  1. JavaWeb中验证码校验的功能实现
  2. Oracle的PL/SQL编程前奏之基础技能实战一(匿名子程序)
  3. matlab绘制横向柱状图
  4. eclipse创建springboot项目_idea创建基于gradle构建的spring boot项目
  5. mysql from_unixtime_MySQL 数据库中日期与时间函数 FROM_UNIXTIME(), UNIX_TIME() ...
  6. 深山红叶PE工具箱嫦娥一号纪念版 V30[1115]
  7. Python模块之MyQR——制作个性化动态二维码(超详细)
  8. centos中多台主机免密登录_centos免密码使用密钥登录
  9. 华为S5700交换机堆叠
  10. 新能力 | 云开发CMS内容管理系统,5分钟搞定小程序管理后台
  11. python文件打开模式rb表示以只读模式打开文件_【Python】python文件打开方式详解——a、a+、r+、w+、rb、rt区别
  12. 游戏数据库数据管理系统开发体会
  13. SpringBoot JPA 懒加载的问题 ---No session
  14. Dango笔记---manage.py 脚本的使用
  15. HTML模仿win10亮度调节效果
  16. ajax + laypage实现分页
  17. Ubuntu 16.04+ROS+ORB-SLAM2配置以及相关问题
  18. 什么是软件维护?在软件已经交付使用后,为了改正错误或满足新需求而修改软件的过程。它有哪几种类型?
  19. VSCode改主题背景
  20. 门面设计模式(Facade Pattern)

热门文章

  1. 谈谈JavaScript的ECMA5中forEach
  2. iOS重写和成员变量访问权限
  3. 嵌入式 uboot引导kernel,kernel引导fs
  4. react native ScrollView
  5. linux 窗口不能移动的替换命令
  6. spring boot http status 400_kubernetes configmap 热更新spring-boot应用
  7. php服务器错误日志在哪里看,PHP取服务器错误日志
  8. android申请多个运行时权限,Android 6.0(API 23) 运行时权限(二)之权限申请
  9. mysql主从安装_MySQL主从详细安装步骤
  10. 从第一范式到第二范式所做的操作是_数据库设计三大范式