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在现在的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就已介绍完毕!

猜你喜欢

转载自blog.csdn.net/speverriver/article/details/79206692