Android实现的RecyclerView适配器
作者:dengzi 时间:2023-07-12 23:02:21
目录
功能
使用
类 SuperAdapter 的作用
类 AbsViewHolder 的作用
Sample
这个适配器我珍藏已久(近两年), 不断看到别人发适配器相关的文章, 但我总觉得没我的好用, 所以今日拿出来分享(宣传)一下, 欢迎各位指正不足.
源码地址: GitHub
功能
无需继承 Adapter, 无需判断 item 类型.
支持页头和页脚.
支持自动展示空数据界面.
通过 Kotlin 的 lambda 大量缩减代码.
支持全局 Item 类型
支持 diff 刷新
使用
添加依赖
implementation "com.dengzii.adapter:$latestVersion"
通过 lambda 快速使用, 这里就快速绑定了四种 item 的布局.
adapter.setEnableEmptyView(true, SuperAdapter.Empty())
adapter.addViewHolderForType<SuperAdapter.Empty>(R.layout.item_empty){
onBindData { _, _ ->
findView<View>(R.id.bt_refresh).setOnClickListener {
// refresh your data
}
}
}
adapter.setHeader("This is header", R.layout.item_header) {
onBindData { data, _ ->
findView<TextView>(R.id.tv_title).text = data
}
}
adapter.setFooter(listOf("This", "is", "footer"), R.layout.item_section) {
onBindData { data, _ ->
findView<TextView>(R.id.tv_title).text = data.joinToString(" ")
}
}
adapter.addViewHolderForType<Header>(R.layout.item_header) {
val title = findView<TextView>(R.id.tv_title)
val content by lazyFindView<TextView>(R.id.tv_content)
onBindData { data, _ ->
title.text = data.title
content.text = data.content
}
}
或者不使用 lambda
val adapter = SuperAdapter(listOf("Item 1", "Item 2", "Item 3"))
adapter.addViewHolderForType(String::class.java, ItemViewHolder::class.java)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
class ItemViewHolder(parent: ViewGroup) : AbsViewHolder<String>(parent) {
private lateinit var mTextView:TextView
override fun onCreate(parent: ViewGroup) {
mTextView = TextView(context)
mTextView.layoutParams = getLayoutParam(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
setContentView(mTextView)
}
override fun onBindData(data: String, position: Int) {
mTextView.text = data
}
}
无需继承 SuperAdapter, 但需要为每种 Item 实现并继承继承抽象类 AbsViewHolder, 并在改类中设置布局和绑定 View, 数据.
AbsViewHolder 代表一种 Item 类型, 其中泛型 T 为该 Item 对应的实体类
类 SuperAdapter 的作用
Adapter 构造器
public SuperAdapter(List<Object> data)
绑定 ViewHolder 到实体类型
public void addViewHolderForType(Class<?> type, Class<? extends AbsViewHolder> holder)
设置 Item 点击事件
public void setOnItemClickListener(OnItemClickListener listener)
public interface OnItemClickListener{
void onItemClick(View v, Object itemData, int position);
}
类 AbsViewHolder 的作用
每个 AbsViewHolder 表示一种 item 类型.
构造器, 必须重写带参数构造器, 否则无法使用, parent 与 Adapter#onCreateViewHolder 中 parent 一致
public AbsViewHolder(@NonNull ViewGroup parent)
创建 Item 时调用 onCreate 方法, 其中 parent 是该 item 的容器布局
public abstract void onCreate(@NonNull ViewGroup parent);
绑定数据
public abstract void onBindData(@NonNull T data, int position);
Sample
设置 Adapter
var data:List<Any>
...
val adapter = SuperAdapter(data)
// 绑定数据类到 ViewHolder
adapter.addViewHolderForType(Item::class.java, ItemViewHolder::class.java)
adapter.addViewHolderForType(Header::class.java, HeaderViewHolder::class.java)
adapter.addViewHolderForType(Section::class.java, SectionViewHolder::class.java)
adapter.setOnItemClickListener(object : SuperAdapter.OnItemClickListener {
override fun onItemClick(v: View?, itemData: Any?, position: Int) {
}
})
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
继承 AbsViewHolder
class ItemViewHolder(parent: ViewGroup) : AbsViewHolder<Item>(parent) {
private lateinit var mTvTitle: TextView
private lateinit var mTvContent: TextView
private lateinit var mIvImage:ImageView
override fun onCreate(parent: ViewGroup) {
setContentView(R.layout.item_item)
mTvTitle = findViewById(R.id.tv_title)
mTvContent = findViewById(R.id.tv_content)
mIvImage = findViewById(R.id.iv_img)
}
override fun onBindData(data: Item, position: Int) {
mTvTitle.text = data.title
mTvContent.text = data.content
mIvImage.setImageResource(data.img)
}
}
来源:https://juejin.cn/post/6938673007795798052
标签:Android,适配器,RecyclerView
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java 中链表的定义与使用方法
2023-03-07 07:34:13
ibatis学习之搭建Java项目
2021-11-02 00:35:29
Idea springboot如何实现批量启动微服务
2022-09-08 09:04:07
![](https://img.aspxhome.com/file/2023/1/88171_0s.png)
java中Unsafe的使用讲解
2022-08-02 08:08:18
JavaWeb详细讲述Cookie和Session的概念
2022-03-23 08:39:44
![](https://img.aspxhome.com/file/2023/2/61272_0s.png)
Java SWT中常见弹出框实例总结
2023-08-22 00:42:22
![](https://img.aspxhome.com/file/2023/9/93349_0s.png)
Java操作FTP实现上传下载功能
2021-12-07 18:35:04
![](https://img.aspxhome.com/file/2023/1/82311_0s.png)
Android实现老虎机小游戏代码示例
2022-08-04 04:15:11
![](https://img.aspxhome.com/file/2023/1/139451_0s.jpg)
Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
2023-05-12 12:18:46
![](https://img.aspxhome.com/file/2023/0/137670_0s.jpg)
学习Java之如何正确地跳出循环结构
2021-10-21 11:21:53
![](https://img.aspxhome.com/file/2023/4/78244_0s.webp)
spring cloud 阿波罗 apollo 本地开发环境搭建过程
2023-01-25 21:04:50
C# Split分隔字符串的应用(C#、split、分隔、字符串)
2021-12-01 23:13:51
函数指针与指针函数的学习总结
2023-07-07 13:13:50
java实现顺时针打印矩阵
2023-06-26 19:17:22
springboot整合通用Mapper简化单表操作详解
2022-08-19 19:24:19
C#中的延时函数sleep
2022-08-05 13:16:49
使用JavaWeb webSocket实现简易的点对点聊天功能实例代码
2023-10-29 00:14:17
mybatis-plus 使用Condition拼接Sql语句各方法的用法
2022-07-06 03:51:12
详解如何使用maven生成可以执行的jar
2023-08-17 00:18:43
Java实现读取163邮箱,qq邮箱的邮件内容
2021-09-27 14:26:31
![](https://img.aspxhome.com/file/2023/9/63159_0s.png)