当一个项目/行被点击时,我需要完成() 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
}
}
finish()
是Activity
类的方法。所以你的任务可以改写为
如何从我的
获得关于Activity
的参考资料?Adapter
所以你至少有两个选择:
用你的
itemView
获得Context
:
(itemView.context as Activity).finish()
从绑定中获取
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
}
}
您还可以在活动本身上创建一个侦听器函数。
在 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()})
我希望这有帮助。