经过 3 年的 Android 经验后,我正在用 Kotlin 编写我的第一个应用程序。只是对如何在 Kotlin 中使用带有 RecyclerView 的 itemClickListener 感到困惑。
我已经尝试过 trait (edit: now interface) 方法,非常类似于 Java
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)
}
}
这似乎非常多余,所以我尝试了内部类方法:
inner class ItemClickListener {
fun onItemClick(view: View, position: Int) {
startActivityFromFragmentForResult<SelectExerciseActivity>(SELECT_EXERCISES)
}
}
然后像这样设置适配器的点击监听器:
val adapter = WorkoutsAdapter(ItemClickListener())
但我仍然对此不满意,因为我认为可能有更好、更清洁的方法。我试图从本质上实现这样的目标: RecyclerView onClick
有什么建议么?
最终得到了批准答案的变体
在活动中定义函数:
val itemOnClick: (View, Int, Int) -> Unit = { view, position, type ->
Log.d(TAG, "test")
}
像这样将函数本身传递给适配器:
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)
}
}
Loop 在下面批准的答案中的扩展功能。
fun <T : RecyclerView.ViewHolder> T.onClick(event: (view: View, position: Int, type: Int) -> Unit): T {
itemView.setOnClickListener {
event.invoke(it, getAdapterPosition(), getItemViewType())
}
return this
}
原文由 Afzal N 发布,翻译遵循 CC BY-SA 4.0 许可协议
我有一点不同的方法。您可以为您的 ViewHolder 创建一个扩展
然后像这样在适配器中使用它
我正在与我的同事一起开发提供此类扩展的 库。