热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现的RecyclerView适配器

这篇文章主要介绍了Android实现的RecyclerView适配器的相关资料,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下

这个适配器我珍藏已久(近两年), 不断看到别人发适配器相关的文章, 但我总觉得没我的好用, 所以今日拿出来分享(宣传)一下, 欢迎各位指正不足.

源码地址: GitHub

功能

  • 无需继承 Adapter, 无需判断 item 类型.
  • 支持页头和页脚.
  • 支持自动展示空数据界面.
  • 通过 Kotlin 的 lambda 大量缩减代码.
  • 支持全局 Item 类型
  • 支持 diff 刷新

使用

添加依赖

implementation "com.dengzii.adapter:$latestVersion"

通过 lambda 快速使用, 这里就快速绑定了四种 item 的布局.

adapter.setEnableEmptyView(true, SuperAdapter.Empty())
adapter.addViewHolderForType(R.layout.item_empty){
 onBindData { _, _ -> 
  findView(R.id.bt_refresh).setOnClickListener { 
   // refresh your data
  }
 }
}
adapter.setHeader("This is header", R.layout.item_header) {
 onBindData { data, _ ->
  findView(R.id.tv_title).text = data
 }
}
adapter.setFooter(listOf("This", "is", "footer"), R.layout.item_section) {
 onBindData { data, _ ->
  findView(R.id.tv_title).text = data.joinToString(" ")
 }
}
adapter.addViewHolderForType(R.layout.item_header) {
 val title = findView(R.id.tv_title)
 val content by lazyFindView(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(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 data)

绑定 ViewHolder 到实体类型

public void addViewHolderForType(Class<&#63;> type, Class<&#63; 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
...
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&#63;, itemData: Any&#63;, position: Int) {

 }
})

recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter

继承 AbsViewHolder

class ItemViewHolder(parent: ViewGroup) : AbsViewHolder(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)
 }
}

以上就是Android实现的RecyclerView适配器的详细内容,更多关于RecyclerView 适配器的资料请关注其它相关文章!


推荐阅读
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 科研单位信息系统中的DevOps实践与优化
    本文探讨了某科研单位通过引入云原生平台实现DevOps开发和运维一体化,显著提升了项目交付效率和产品质量。详细介绍了如何在实际项目中应用DevOps理念,解决了传统开发模式下的诸多痛点。 ... [详细]
  • 本文介绍了一种在 MySQL 客户端执行 NOW() 函数时出现时间偏差的问题,并详细描述了如何通过配置文件调整时区设置来解决该问题。演示场景中,假设当前北京时间为2023年2月17日19:31:37,而查询结果显示的时间比实际时间晚8小时。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 本文详细介绍了如何规划和部署一个高可用的Etcd集群,包括主机配置、软件安装、防火墙设置及集群健康检查等内容。通过合理的硬件配置和网络规划,确保Etcd集群在生产环境中的稳定运行。 ... [详细]
  • 在成功安装和测试MySQL及Apache之后,接下来的步骤是安装PHP。为了确保安全性和配置的一致性,建议在安装PHP前先停止MySQL和Apache服务,并将MySQL集成到PHP中。 ... [详细]
author-avatar
元元木樨_669
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有