Kotlin - 如何使用绑定(不是上下文)在 RecyclerViewAdapter 中调用 finish()

问题描述 投票:0回答:2

当一个项目/行被点击时,我需要完成() RecyclerView 所在的活动。

我查了一下,但大多数答案都提到了使用

context
(context as MyActivity).finish()
时做事的旧方法。我怎么能用
binding

做同样的事情
class MyAdapter(var users: List<User>): RecyclerView.Adapter<MyAdapter.UserViewHolder>() {

    inner class UserViewHolder(private val binding: UserRowBinding): RecyclerView.ViewHolder(binding.root) {

        init {
            binding.root.setOnClickListener {

                val intent = Intent(binding.root.context, NextActivity::class.java)
                binding.root.context.startActivity(intent)

                // call finish() here
            }
        }
    }
}

class MyActivity: App: AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        val adapter = MyAdapter(some_array_Of_users)
        binding.recyclerView.adapter = adapter
    }
}
kotlin android-recyclerview android-viewbinding activity-finish
2个回答
0
投票

finish()
Activity
类的方法。所以你的任务可以改写为

如何从我的

Activity
获得关于
Adapter
的参考资料?

所以你至少有两个选择:

  1. 用你的

    itemView
    获得
    Context

    (itemView.context as Activity).finish()
    
  2. 从绑定中获取

    Context

    (binding.root.context as Activity).finish()
    

小建议:

您也可以考虑将点击处理委托给调用方并传递给适配器。就架构而言,它可能更正确。并且找到您

Activity
的参考不会有问题。像这样的东西:

class MyAdapter(var users: List<User>, private val onClick: OnClickListener): RecyclerView.Adapter<MyAdapter.UserViewHolder>() {

    inner class UserViewHolder(private val binding: UserRowBinding): RecyclerView.ViewHolder(binding.root) {

        init {
            binding.root.setOnClickListener {
                onClick()
            }
        }
    }
}

class MyActivity: App: AppCompatActivity() {

    lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        val adapter = MyAdapter(some_array_Of_users) {                     
            val intent = Intent(binding.root.context, NextActivity::class.java)
            startActivity(intent)
            [email protected]()
        }
        binding.recyclerView.adapter = adapter
    }
}

0
投票

您还可以在活动本身上创建一个侦听器函数。

在 Adapter 中,你可以为你的监听器添加一个变量。 (或者您可以将其添加为适配器的参数)

val listener: (()->Unit)? = null

在 ViewHolder 中,添加监听器作为你的参数,并在 setOnClickListener 中调用它,它应该是这样的:

  inner class UserViewHolder(private val binding: UserRowBinding, private val listener: (()->Unit)? = null): RecyclerView.ViewHolder(binding.root) {

    init {
        binding.root.setOnClickListener {
            listener?.invoke()
        }
    }
}

在你的Activity中,你可以设置变量listener的值。在这种情况下,您可以设置您要查找的“finish()”。看起来像这样,

class MyActivity: App: AppCompatActivity() {

lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // ...

    val adapter = MyAdapter(some_array_Of_users)
    adapter.listener = { moveToOtherActivity() }
    this.adapter = adapter
}

  private fun moveToOtherActivity() {
      val intent = Intent(this@MainActivity, NextActivity::class.java)
      startActivity(intent)
      finish()
    }
}

或者只是在你的适配器中添加一个参数,

class MyAdapter(var users: List<User>, val listener: (()->Unit?=null): RecyclerView.Adapter<MyAdapter.UserViewHolder>()

在活动中,

 val adapter = MyAdapter(some_array_Of_users, {moveToOtherActivity()})

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.