Android实现的RecyclerView适配器
作者:dengzi 发布时间:2023-07-12 23:02:21
标签:Android,适配器,RecyclerView
目录
功能
使用
类 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


猜你喜欢
- 本文实例讲述了C#基于简单工厂模式实现的计算器功能。分享给大家供大家参考,具体如下:子类拥有父类除私有之外的所有属性字段和方法using S
- /// <summary>/// 人民币大写/// </summary>/// <param name=&qu
- 题目描述:给定一 m*n 的矩阵,请按照逆时针螺旋顺序,返回矩阵中所有元素。示例:思路:这是一道典型的模拟问题:我们可以分析一下,遍历前进轨
- 导语如下图所示,这是一个导航选择弹框。进行单项选择,然后会监听回调选择的事件。问题是Android的RadioButton是一般是放在Rad
- 本文实例讲述了Android编程自定义菜单实现方法。分享给大家供大家参考,具体如下:在android开发的过程中系统自带的菜单往往满足不了开
- XML对开发者来说十分的方便,不仅使用起来简单,而且能够及时调试,修改界面之后马上能看到效果。Java设置布局不具有这个优势。但是java却
- Criteria的and和or进行联合查询DemoExample example=new DemoExample ();DemoExampl
- 本文实例讲述了Android布局之LinearLayout自定义高亮背景的方法。分享给大家供大家参考,具体如下:首先创建linearlayo
- 函数指针是指向函数的指针,指针函数是指一个函数的返回值是一个指针,但下面的几道题还是感觉很迷惑。各位能否讲的详细点呢?(1) float(*
- 最近要搞一个项目,需要上传相册和拍照的图片,不负所望,终于完成了! 不过需要说明一下,其实网上很多教程拍照的图片,都是缩略图不是
- malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的
- 使用抽象类应该注意的几个要点:包含一个或者多个抽象方法的类必须被声明为抽象类. 将类声明为抽象类,不一定含有抽象方法.通常认为,在抽象类中不
- 一,使用注解: 在spring的配置文件applicationContext.xml中,加入注解扫描。配
- 本文实例讲述了WinForm实现移除控件某个事件的方法,供大家参考借鉴一下。具体功能代码如下:主要功能部分代码如下:/// <summ
- 关于 Android 实现 iOS 上的滚轮选择效果的控件,到 github 上一搜一大堆,之所以还要造这个轮子,目的是为了更好的学习自定义
- Java服务出现了OOM(Out Of Memory)问题,总结了一些相对通用的方案,希望能帮助到Java技术栈的同学。某Java服务(假设
- 在使用多线程的时候有时候我们会使用 java.util.concurrent.Executors的线程池,当多个线程异步执行的时候,我们往往
- RenderScript 介绍在开始之前,先看下 RenderScript 的官方介绍:RenderScript is a framewor
- 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对
- 一、java内存区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和