Kotlin 中的 RecyclerView itemClickListener [英] RecyclerView itemClickListener in Kotlin
问题描述
在使用 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屋!