Android实现的RecyclerView适配器
程序员文章站
2022-07-10 15:30:52
这个适配器我珍藏已久(近两年), 不断看到别人发适配器相关的文章, 但我总觉得没我的好用, 所以今日拿出来分享(宣传)一下, 欢迎各位指正不足.源码地址: github功能 无需继承 adapter...
这个适配器我珍藏已久(近两年), 不断看到别人发适配器相关的文章, 但我总觉得没我的好用, 所以今日拿出来分享(宣传)一下, 欢迎各位指正不足.
源码地址: 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) } }
以上就是android实现的recyclerview适配器的详细内容,更多关于recyclerview 适配器的资料请关注其它相关文章!
上一篇: 再晚点朕就要不行了
推荐阅读