Kotlin的RecyclerView适配器

时间:2022-03-28 23:03:50

1 class MyAdapter : RecyclerView.Adapter() {
2
3 override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
4 }
5
6 override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
7 }
8
9 override fun getItemCount(): Int {
10 }
11
12 class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
13 }


有些元素被标注为nullable。这是因为如果库没有适当的@Nullable和@NonNull标注,Kotlin就没有方法知道null是否允许,这就要让我们来决定了。

如果我们通过默认方式自创建方法了,它就会认为其值是nullable。

但是,进一步研究支持库,我们就知道哪些值是为null,所以我们能够删除它。

1 class MyAdapter : RecyclerView.Adapter() {
2
3 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
4 }
5
6 override fun onBindViewHolder(holder: ViewHolder, position: Int) {
7 }
8
9 override fun getItemCount(): Int {
10 }
11
12 class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
13 }


构造函数

适配器需要接收参数项目和侦听器。这就像这样:
class MyAdapter(val items: List, val listener: (Item) -> Unit)

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(parent.inflate(R.layout.view_item))

override fun onBindViewHolder(holder: ViewHolder, position: Int) = holder.bind(items[position], listener)

override fun getItemCount() = items.size

有三个方法可以实现由简约的形式,获得以前的结果。用三行我们就实现了完整的适配器。

现在就去实现ViewHolder。

ViewHolder

ViewHolder由模型分配值到它们相应的视图:

1 class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
2 fun bind(item: Item, listener: (Item) -> Unit) = with(itemView) {
3 itemTitle.text = item.title
4 itemImage.loadUrl(item.url)
5 setOnClickListener { listener(item) }
6 }
7 }


这里的每件事都已经在其他文章中读到:with函数、ImageView的loadUrl扩展函数,用Kotlin Android扩展访问视图,和点击侦听器的映射。

适配器赋值

现在仅剩一件事:将适配器赋值到视图:
1 recycler.layoutManager = GridLayoutManager(this, 2)
2 recycler.adapter = MyAdapter(items) {
3 toast("${it.title} Clicked")
4 }

最后一个函数是侦听器,它接收一项。当您点击这项时,代码就简单地将标题打印到该项上。

由于涉及项目隐私 只贴部分代码
项目效果展示apk : http://imtt.dd.qq.com/16891/670C11ECFEA442BE99BACA612A7EA798.apk?fsname=com.ycjt.ycnyzx_1.0.1_1.apk&csr=1bbd

或 : http://android.myapp.com/myapp/detail.htm?apkName=com.ycjt.ycnyzx

安卓开发交流群 : 595856941