博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Kotlin 写一个通用Adapter (二)
阅读量:5903 次
发布时间:2019-06-19

本文共 2432 字,大约阅读时间需要 8 分钟。

说在前面

上次写了一个通用adapter,用的过程中,发现还是没那么方便,每次数据绑定的时候都要强转一次,bindView时也不够简洁,通过进一步学习kotlin,进行了优化,性能的话,单看二者没有多大区别,主要是在写法的简洁度上做出了改善,先放出代码

/** * actor 晴天 create 2019/5/17 * 封装一个kotlin下的通用adapter */class KotlinDataAdapter
private constructor() : RecyclerView.Adapter
.MyViewHolder>() { //数据 private var mDatalist: ArrayList
? = null //布局id private var mLayoutId: Int? = null //绑定事件的lambda放发 private var addBindView: ((itemView: View, itemData: T) -> Unit)? = null override fun onCreateViewHolder(p0: ViewGroup, p1: Int): MyViewHolder { val view = LayoutInflater.from(p0.context).inflate(mLayoutId!!, p0, false) return MyViewHolder(view) } override fun getItemCount(): Int { return mDatalist?.size ?: -1 //左侧为null时返回-1 } override fun onBindViewHolder(p0: MyViewHolder, p1: Int) { addBindView?.invoke(p0.itemView, mDatalist?.get(p1)!!) } inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) /** * 建造者,用来完成adapter的数据组合 */ class Builder
{ private var adapter: KotlinDataAdapter = KotlinDataAdapter() /** * 设置数据 */ fun setData(lists: ArrayList): Builder { adapter.mDatalist = lists return this } /** * 设置布局id */ fun setLayoutId(layoutId: Int): Builder { adapter.mLayoutId = layoutId return this } /** * 绑定View和数据 */ fun addBindView(itemBind: ((itemView: View, itemData: B) -> Unit)): Builder { adapter.addBindView = itemBind return this } fun create(): KotlinDataAdapter { return adapter } }}复制代码

使用方法如下

val  adapter = KotlinDataAdapter.Builder
() .setData(deviceList) .setLayoutId(R.layout.item_device) .addBindView { itemView, itemData -> itemView.tv_device_name.text = if (itemData.platform.isEmpty()) "未命名" else } .create()复制代码

看起来其实差别也不算太大哈,主要变化是在声明的时候,采用了泛型,声明时需要传入指定的数据类型,再者是,之前在addBindView得时候,需要用object:来传入对象,再在里面实现方法,这次我使用了lambda表达式的方式,addBindView的时候就可以直接传入lambda表达式,从而进一步简化了代码,代码其实很简单,想要进一步了解的可以搜索一下kotlin的lambda方法,和高阶函数的使用

//绑定事件的lambda放发    private var addBindView: ((itemView: View, itemData: T) -> Unit)? = null        /**    * 绑定View和数据    */    fun addBindView(itemBind: ((itemView: View, itemData: B) -> Unit)): Builder {        adapter.addBindView = itemBind        return this    }复制代码

转载于:https://juejin.im/post/5cde5d5e518825259919395b

你可能感兴趣的文章
kvm-1
查看>>
leetcode 64. Minimum Path Sum
查看>>
textkit
查看>>
CentOS7+CDH5.14.0安装CDH错误排查: HiveServer2 该角色的进程已退出。该角色的预期状态为已启动...
查看>>
The Oregon Trail 俄勒冈之旅
查看>>
Excel VBA连接MySql 数据库获取数据
查看>>
Developing a Service Provider using Java API(Service Provider Interface)(转)
查看>>
oschina程序开发
查看>>
nested exception is java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter
查看>>
“正在注册字体”问题解决
查看>>
windows10 更新后要输入2次密码才能进入系统
查看>>
iOS开发-OpenGL ES入门教程1
查看>>
平衡二叉树(AVL树)
查看>>
面向对象思想(第一天)
查看>>
微信小程序 js逻辑
查看>>
linux 安装 sftp
查看>>
openStack queens
查看>>
(转)EOSIO开发(四)- nodeos、keosd与cleos
查看>>
MVC5+EF6 入门完整教程八
查看>>
Java 设计模式专栏
查看>>