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

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

前言

最近用kotlin写代码,感觉很舒服,重构一个之前的项目,在写adapter的时候,发现相比用java写,可以不用在ViewHolder里面定义一堆控件变量,再findViewById一些列操作。在这之前我也搜了一下,kotlin里面写RecyclerView的adapter,发现很多人都是在viewHolder里面又findId,定义一堆控件,相当于把java写的代码拷贝到kotlin里面自动生成。少了一点简洁的感觉。 对比以前各个adapter,其实只有两个位置写法不一样,onBindViewHolder和MyViewHolder

在用kotlin之后就剩下一个地方不一样了,于是我考虑直接写一个通用的adapter,免得每次有列表的时候都要新建一个adapter,这样太过繁琐,我又是个比较懒得人,于是说干就干。先贴代码

class CommentAdapter private constructor(): RecyclerView.Adapter
() { private var mDatalist: List<*>? = null private var mLayoutId:Int? = null private var mBindView: BindView? = 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 } override fun onBindViewHolder(p0: MyViewHolder, p1: Int) { mBindView?.onBindView(p0, mDatalist?.get(p1)) //在onBindView方法里面实现绑定 } inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) /** * 绑定接口 */ interface BindView{ fun onBindView(viewHolder: MyViewHolder, data: Any?) } /** * 建造者,用来完成adapter的数据组合 */ class Builder{ private var commentAdapter: CommentAdapter = CommentAdapter() fun setDatas(lists: List<*>): Builder { commentAdapter.mDatalist = lists return this } fun setLayoutId(layoutId:Int): Builder { commentAdapter.mLayoutId = layoutId return this } fun bindView(bindView: BindView): Builder { commentAdapter.mBindView = bindView return this } fun create(): CommentAdapter { return commentAdapter } }}复制代码

为了调用方便,我采用了比较流行的链式创建,使用方法很简单如下:

recyclerRecommend.adapter = CommentAdapter.Builder()                .setDatas(videos.data)                .setLayoutId(R.layout.item_recommend)                .bindView(object : CommentAdapter.BindView{                    override fun onBindView(viewHolder: CommentAdapter.MyViewHolder, data: Any?) {                        val myData:Data = data as Data                        viewHolder.itemView.text_comment.text = myData.name                    }                })                .create()复制代码

设置数据和布局id,再添加bindView方法,这个方法是用来绑定数据和控件的只需要viewHolder.itemView.控件名 就可以拿到该控件进行操作了,总体来说,想就相当于将bindView提取出来,在外部实现了。记录一下,只能在kotlin中使用,写的有问题的地方,还请大佬指点一下

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

你可能感兴趣的文章
进程间通信【转】
查看>>
asp.net Excel操作-读写
查看>>
架构之谈
查看>>
1.HTML复习(常用的标签,属性,div布局,meta)
查看>>
java最新全套学习视频(java,前端,其他语言)
查看>>
多年心愿,终于完成,热泪盈眶啊。。。Adrew NG 的 机器学习
查看>>
R语言markov switching model马尔可夫转换模型研究商业周期
查看>>
设计模式学习
查看>>
Robot Framework(五)使用测试库
查看>>
Spark2 Model selection and tuning 模型选择与调优
查看>>
使用vs code开发.net core2.2时OmniSharp.MSBuild.ProjectLoader无法解析"xxx"的解决方法
查看>>
iOS之 opencv3.0.framework
查看>>
css 兼容ie8 rgba()用法
查看>>
[转载]如何从 Windows Phone 的罗盘传感器获取数据
查看>>
ASP.NET MVC5 入门
查看>>
动态规划
查看>>
Java enum枚举的使用方法
查看>>
主账号删除后,查询应用时,无法翻页
查看>>
Android 4.4.4: java.lang.SecurityException: Package com.android.settings does not belong to 1001
查看>>
java中生成验证码,以及验证码的使用
查看>>