List列表的万能的适配器
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列表的万能的适配器相关推荐
- listview-android:打造万能通用适配器(转)
转载:https://blog.csdn.net/q649381130/article/details/51781921: 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广 ...
- android中适配器,android:打造万能通用适配器
本文原创,转载请注明出处. 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广大安卓开发者需要掌握和优化的技巧. 本文旨在介绍一个通用的适配器BaseCommAdapter写 ...
- 第7天 Recyclerview万能的适配器(基本使用、分割线、增加删除动画)
第7天 Recyclerview万能的适配器(基本使用.分割线.增加删除动画) Recyclerview的使用 思路 代码 Recyclerview的使用 用了很长一段时间的RecyclerView, ...
- Android:打造万能通用适配器
原文地址:http://blog.csdn.net/q649381130/article/details/51781921 1.前言 listview作为安卓项目中一个的明星控件,它的适配器的写法是广 ...
- android listview高级,Android 高级控件笔记-列表视图ListView 基本适配器BaseAdapter
我最近做项目用到了基本适配器BaseAdapter,所以写篇博客总结一下,希望也能对你有所帮助 什么时候用BaseAdapter(同一项存在多个控件,复杂的列表时) Android中Adapter类其 ...
- 高级控件——列表类视图——基本适配器BaseAdapter
=================================================================== 第一个页面布局: <LinearLayout xmlns: ...
- 万能ExpandableListAdapter适配器
转载请声明:http://blog.csdn.net/yoyo_newbie/article/details/50350975 源码下载地址:https://github.com/Sam4748506 ...
- Android万能适配器BaseRecyclerViewAdapterHelper的简单使用
继我们上一章的网络请求的封装中,我们在现有的项目中通过我们的万能适配器来写一个简单的Recyclerview列表 效果图 video1 首先还是同样的道理,我们需要进行一个简单的依赖添加 //recy ...
- RecyclerView超级万能适配器(多布局、head、foot、下拉刷新、上拉自动更多、滑动删除)
使用方法 GitHub APK下载 将libray模块复制到项目中,或者直接在build.gradle中依赖: allprojects {repositories {maven { url 'http ...
最新文章
- JavaWeb中验证码校验的功能实现
- Oracle的PL/SQL编程前奏之基础技能实战一(匿名子程序)
- matlab绘制横向柱状图
- eclipse创建springboot项目_idea创建基于gradle构建的spring boot项目
- mysql from_unixtime_MySQL 数据库中日期与时间函数 FROM_UNIXTIME(), UNIX_TIME() ...
- 深山红叶PE工具箱嫦娥一号纪念版 V30[1115]
- Python模块之MyQR——制作个性化动态二维码(超详细)
- centos中多台主机免密登录_centos免密码使用密钥登录
- 华为S5700交换机堆叠
- 新能力 | 云开发CMS内容管理系统,5分钟搞定小程序管理后台
- python文件打开模式rb表示以只读模式打开文件_【Python】python文件打开方式详解——a、a+、r+、w+、rb、rt区别
- 游戏数据库数据管理系统开发体会
- SpringBoot JPA 懒加载的问题 ---No session
- Dango笔记---manage.py 脚本的使用
- HTML模仿win10亮度调节效果
- ajax + laypage实现分页
- Ubuntu 16.04+ROS+ORB-SLAM2配置以及相关问题
- 什么是软件维护?在软件已经交付使用后,为了改正错误或满足新需求而修改软件的过程。它有哪几种类型?
- VSCode改主题背景
- 门面设计模式(Facade Pattern)
热门文章
- 谈谈JavaScript的ECMA5中forEach
- iOS重写和成员变量访问权限
- 嵌入式 uboot引导kernel,kernel引导fs
- react native ScrollView
- linux 窗口不能移动的替换命令
- spring boot http status 400_kubernetes configmap 热更新spring-boot应用
- php服务器错误日志在哪里看,PHP取服务器错误日志
- android申请多个运行时权限,Android 6.0(API 23) 运行时权限(二)之权限申请
- mysql主从安装_MySQL主从详细安装步骤
- 从第一范式到第二范式所做的操作是_数据库设计三大范式