Kotlin 中的 RecyclerView itemClickListener [英] RecyclerView itemClickListener in Kotlin

查看:26
本文介绍了Kotlin 中的 RecyclerView itemClickListener的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用 Android 3 年后,我正在用 Kotlin 编写我的第一个应用程序.只是对如何在 Kotlin 中使用 itemClickListener 和 RecyclerView 感到困惑.

我已经尝试了 trait (edit: now interface) 方法,非常像 Java

公共类 MainActivity : ActionBarActivity() {protected override fun onCreate(savedInstanceState: Bundle?) {//设置内容视图等在此行上方类 itemClickListener : ItemClickListener {覆盖乐趣 onItemClick(view: View, position: Int) {Toast.makeText(this@MainActivity, "TEST: " + position, Toast.LENGTH_SHORT).show()}}val 适配器 = DrawerAdapter(itemClickListener())mRecyclerView.setAdapter(适配器)}特性 ItemClickListener {有趣的 onItemClick(视图:视图,位置:Int)}}

这看起来很多余,所以我尝试了内部类方法:

内部类ItemClickListener {有趣的 onItemClick(视图:视图,位置:Int){startActivityFromFragmentForResult(SELECT_EXERCISES)}}

然后像这样设置适配器的点击监听器:

val 适配器 = WorkoutsAdapter(ItemClickListener())

但我仍然对此不满意,因为我认为可能有更好、更清洁的方法.我试图从本质上实现这样的目标:RecyclerView onClick

有什么建议吗?

最终采用了已批准答案的变体

在activity中定义函数:

val itemOnClick: (View, Int, Int) ->单位 = { 视图、位置、类型 ->Log.d(标签,测试")}

像这样将函数本身传递给适配器:

class ExercisesAdapter(val itemClickListener: (View, Int, Int) -> Unit) : RecyclerView.Adapter() {覆盖乐趣 onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {//其他的东西在这里val vhExercise = ExerciseVH(view)//视图持有者//通过扩展函数到视图持有者vhExercise.onClick(itemClickListener)}}

在下面批准的答案中通过循环扩展功能.

fun T.onClick(event: (view: View, position: Int, type: Int) -> Unit): T {itemView.setOnClickListener {event.invoke(it, getAdapterPosition(), getItemViewType())}返回这个}

解决方案

我有一点不同的方法.您可以为 ViewHolder 创建扩展

fun T.listen(event: (position: Int, type: Int) -> Unit): T {itemView.setOnClickListener {event.invoke(getAdapterPosition(), getItemViewType())}返回这个}

然后像这样在适配器中使用它

class MyAdapter : RecyclerView.Adapter() {val 项:MutableList= arrayListOf()覆盖 fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder?{val inflater = LayoutInflater.from(parent!!.getContext())val view = inflater.inflate(R.layout.item_view, parent, false)返回 MyViewHolder(view).listen { pos, type ->val item = items.get(pos)//TODO在这里做其他事情}}覆盖乐趣 onBindViewHolder(holder: MyViewHolder?, position: Int) {}覆盖乐趣 getItemCount(): Int {返回 items.size()}类 MyViewHolder(视图:视图):RecyclerView.ViewHolder(视图){}}

我正在与我的同事合作开发,提供此类扩展.>

I'm writing my first app in Kotlin after 3 years of experience with Android. Just confused as to how to utilize itemClickListener with a RecyclerView in Kotlin.

I have tried the trait (edit: now interface) approach, very Java-like

public class MainActivity : ActionBarActivity() {

  protected override fun onCreate(savedInstanceState: Bundle?) {

    // set content view etc go above this line

    class itemClickListener : ItemClickListener {
      override fun onItemClick(view: View, position: Int) {
        Toast.makeText(this@MainActivity, "TEST: " + position, Toast.LENGTH_SHORT).show()
      }
    }

    val adapter = DrawerAdapter(itemClickListener())
    mRecyclerView.setAdapter(adapter)
 }

  trait ItemClickListener {
    fun onItemClick(view: View, position: Int)
  }
}

That seemed very redundant so I tried the inner class approach:

inner class ItemClickListener {
    fun onItemClick(view: View, position: Int) {
        startActivityFromFragmentForResult<SelectExerciseActivity>(SELECT_EXERCISES)
    }
}

And then just setting the adapter's click listener like this:

val adapter = WorkoutsAdapter(ItemClickListener())

But I'm still not satisfied with this because I think there might be a better, cleaner way. I'm trying to essentially achieve something like this: RecyclerView onClick

Any suggestions?

Ended up going with a variation of the approved answer

Defined the function in the activity:

val itemOnClick: (View, Int, Int) -> Unit = { view, position, type ->
    Log.d(TAG, "test")
}

Passed the function itself on to the adapter like this:

class ExercisesAdapter(val itemClickListener: (View, Int, Int) -> Unit) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
      // other stuff up here
      val vhExercise = ExerciseVH(view) // view holder
      // on to the view holder through the extension function
      vhExercise.onClick(itemClickListener)
    }
}

Extension function by Loop in the approved answer below.

fun <T : RecyclerView.ViewHolder> T.onClick(event: (view: View, position: Int, type: Int) -> Unit): T {
    itemView.setOnClickListener {
        event.invoke(it, getAdapterPosition(), getItemViewType())
    }
    return this
}

解决方案

I have a little bit different approach. You can create an extension for your ViewHolder

fun <T : RecyclerView.ViewHolder> T.listen(event: (position: Int, type: Int) -> Unit): T {
    itemView.setOnClickListener {
        event.invoke(getAdapterPosition(), getItemViewType())
    }
    return this
}

Then use it in adapter like this

class MyAdapter : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    val items: MutableList<String> = arrayListOf()

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyViewHolder? {
        val inflater = LayoutInflater.from(parent!!.getContext())
        val view = inflater.inflate(R.layout.item_view, parent, false)
        return MyViewHolder(view).listen { pos, type ->
            val item = items.get(pos)
            //TODO do other stuff here
        }
    }

    override fun onBindViewHolder(holder: MyViewHolder?, position: Int) {

    }

    override fun getItemCount(): Int {
        return items.size()
    }


    class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) {

    }
}

I am working with my colleagues on library providing such extensions.

这篇关于Kotlin 中的 RecyclerView itemClickListener的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆