Kotlin编写RecyclerView的Adapter

Kotlin编写RecyclerView的Adapter

kotlin在现在的Android开发中已经较为常见,空闲之余学习一下还是非常必要的,没准儿哪天就可以利用它进行些骚操作呢(梦想还是要有的)。

利用Kotlin编写一个简单的Adapter

class SimpleAdapter(private val context: Context, private val data: List<String>) : RecyclerView.Adapter<SimpleAdapter.SimpleViewHolder>() {
    override fun onBindViewHolder(holder: SimpleViewHolder?, position: Int) {
        holder?.textView?.text = data[position]
    }

    override fun getItemCount(): Int = data.size

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): SimpleViewHolder
            = SimpleViewHolder(LayoutInflater.from(context)
            .inflate(R.layout.item_recycler, parent, false))

    inner class SimpleViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var textView: TextView = view.findViewById(R.id.item_tv)
    }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

上面adapter完成了一个List集合数据的简单绑定,是不是发现相对于用Java实现同样功能代码更为精简。

在onBindViewHolder方法里面调用如下代码

holder?.textView?.setOnClickListener {
            Toast.makeText(context, "click", Toast.LENGTH_SHORT).show()
        }
   
   
  • 1
  • 2
  • 3

为item中的控件设置监听器,至此一个简单的adapter编写完成。

Adapter中包含不同item类型

废话不多说直接上代码

class RecyclerAdapter(private val context: Context, private val data: List<String>)
    : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private val HEADER = 0
    private val NORMAL = 1
    private val FOOTER = 2

    override fun getItemCount(): Int = data.size


    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder? = when (viewType) {
        HEADER -> {
            HeaderViewHolder(LayoutInflater.from(context).
                    inflate(R.layout.item_header, parent, false))
        }

        FOOTER -> {
            FooterViewHolder(LayoutInflater.from(context)
                    .inflate(R.layout.item_footer, parent, false))
        }

        else -> {
            RecyclerViewHolder(LayoutInflater.from(context)
                    .inflate(R.layout.item_recycler, parent, false))
        }

    }

    /**
     * 利用kotlin中的when代替Java中的if/else
     * 返回不同的item类型
     */
    override fun getItemViewType(position: Int): Int = when (position) {
        0 -> {
            HEADER
        }
        itemCount - 1 -> {
            FOOTER
        }
        else -> {
            NORMAL
        }
    }

    /**
     * 根据不同的item类型绑定不同的数据
     */
    override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
        when (getItemViewType(position)) {
            HEADER -> {
                if (holder is HeaderViewHolder) {
                    holder.tv.text = "I am Header"
                    holder.tv.setOnClickListener {
                        Toast.makeText(context, "I am Header", Toast.LENGTH_SHORT).show()
                    }
                }
            }
            FOOTER -> {
                if (holder is FooterViewHolder) {
                    holder.tv.text = "I am Footer"
                }
            }
            else -> {
                if (holder is RecyclerViewHolder) {
                    holder?.textView?.text = data[position]
                    holder.textView.setOnClickListener {
                        Toast.makeText(context, "click", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }
    }

    inner class RecyclerViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var textView: TextView = view.findViewById(R.id.item_tv)
    }

    class HeaderViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var tv: TextView = view.findViewById(R.id.tv_header)
    }

    inner class FooterViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var tv: TextView = view.findViewById(R.id.tv_footer)
    }
}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

全文字随便来张效果图吧

如果某个item中控件的监听器我不想写在或者不能写在(更新view某些原因导致的)onBindViewHolder方法中,ViewHolder该怎么写?

inner class FooterViewHolderTwo : RecyclerView.ViewHolder {
        constructor(view: View) : super(view) {
            tv = view.findViewById(R.id.tv_footer)
            tv.setOnClickListener {
                Toast.makeText(context, "I am Footer", Toast.LENGTH_SHORT).show()
            }
        }

        var tv: TextView
    }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意:类FooterViewHolderTwo需要访问类RecyclerAdapter的成员context,需要用 inner 声明,不然是访问不到的哟!

接口的声明与调用

interface MyInterface {
        fun test(position: Int)
    }
var myInterface: MyInterface? = null
fun setListener(myInterface: MyInterface?) {
        this.myInterface = myInterface
    }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

很常规的操作

至此,关于Kotlin编写RecyclerView的Adapter就已介绍完毕!

### 创建和使用 Kotlin 中的 RecyclerView Adapter #### 使用标准写法创建适配器 在 Kotlin 中实现 `RecyclerView` 的适配器可以通过继承 `RecyclerView.Adapter` 类来完成。下面是一个基本的例子,展示了如何创建并配置一个简单的适配器: ```kotlin class MyAdapter(private val dataList: List<String>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() { class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) { val textView: TextView = view.findViewById(R.id.textView) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false) return MyViewHolder(view) } override fun onBindViewHolder(holder: MyViewHolder, position: Int) { holder.textView.text = dataList[position] } override fun getItemCount(): Int = dataList.size } ``` 为了使这个适配器生效,还需要将它绑定到 `RecyclerView` 上[^1]。 ```kotlin val recyclerView: RecyclerView = findViewById(R.id.recyclerView) recyclerView.adapter = MyAdapter(dataList) ``` #### 封装后的通用适配器 对于更复杂的应用场景,可以考虑采用已经封装好的通用适配器库。例如,有一种名为 `KtBaseAdapter` 的普通通用适配器以及结合了 Data Binding 技术的 `KtDBBaseAdapter`。后者允许开发者无需手动编写适配器类即可轻松管理视图与数据之间的关系[^2]。 当选择了合适的适配器之后,只需要按照文档说明调整布局文件和数据源部分就可以快速集成进项目里去了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值