欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现的RecyclerView适配器

程序员文章站 2022-04-12 16:46:48
这个适配器我珍藏已久(近两年), 不断看到别人发适配器相关的文章, 但我总觉得没我的好用, 所以今日拿出来分享(宣传)一下, 欢迎各位指正不足.源码地址: 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 适配器的资料请关注其它相关文章!