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
0
投稿

猜你喜欢

  • java 中链表的定义与使用方法

    2023-03-07 07:34:13
  • ibatis学习之搭建Java项目

    2021-11-02 00:35:29
  • Idea springboot如何实现批量启动微服务

    2022-09-08 09:04:07
  • java中Unsafe的使用讲解

    2022-08-02 08:08:18
  • JavaWeb详细讲述Cookie和Session的概念

    2022-03-23 08:39:44
  • Java SWT中常见弹出框实例总结

    2023-08-22 00:42:22
  • Java操作FTP实现上传下载功能

    2021-12-07 18:35:04
  • Android实现老虎机小游戏代码示例

    2022-08-04 04:15:11
  • Android 游戏引擎libgdx 资源加载进度百分比显示案例分析

    2023-05-12 12:18:46
  • 学习Java之如何正确地跳出循环结构

    2021-10-21 11:21:53
  • 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
  • asp之家 软件编程 m.aspxhome.com