gpt4 book ai didi

android - Kotlin 中的 RecyclerView itemClickListener

转载 作者:IT老高 更新时间:2023-10-28 13:27:06 46 4
gpt4 key购买 nike

在拥有 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

有什么建议吗?

最终选择了批准答案的变体

在activity中定义函数:

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
}

最佳答案

我的解决方案就像以前的解决方案与来自 Activity 的 super 干净调用的组合。

ContactAdapter:

class ContactAdapter @Inject constructor() : RecyclerView.Adapter<ContactAdapter.ViewHolder>() {

var onItemClick: ((Contact) -> Unit)? = null
var contacts: List<Contact> = emptyList()

...

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
val contact = contacts[position]

holder.email.text = contact.email
}

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val email: TextView = itemView.email

init {
itemView.setOnClickListener {
onItemClick?.invoke(contacts[adapterPosition])
}
}
}
}

联系 Activity :

override fun setupRecyclerAdapter() {
recyclerView.adapter = contactAdapter
recyclerView.layoutManager = LinearLayoutManager(this)

contactAdapter.onItemClick = { contact ->

// do something with your item
Log.d("TAG", contact.email)
}
}

关于android - Kotlin 中的 RecyclerView itemClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29424944/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com