简体   繁体   English

kotlin 中 recyclerview 项目的 Itemclicklistener

[英]Itemclicklistener on recyclerview item in kotlin

How to move from one activity to another by clicking on recyclerview item and also pass some details of the clicked item in intent?如何通过单击 recyclerview 项目从一项活动移动到另一项活动,并在意图中传递所单击项目的一些详细信息?

This is how my adapter class looks like这就是我的适配器 class 的样子

var onItemClick : ((Contest)->Unit)?=null
private lateinit var mListener: onItemClickListener
interface onItemClickListener{
    fun onItemClick(position: Int)
}

fun setOnItemClickListener(listener: onItemClickListener){
    mListener = listener
}



inner class MyViewHolder(itemView:View,listener: onItemClickListener):RecyclerView.ViewHolder(itemView ){
    val name: TextView = itemView.findViewById(R.id.card_title)
    val time: TextView = itemView.findViewById(R.id.card_time)
    val venue: TextView = itemView.findViewById(R.id.card_venue)
    val team: TextView = itemView.findViewById(R.id.card_team_type)
    val prize: TextView = itemView.findViewById(R.id.card_prize)
    val entry: TextView = itemView.findViewById(R.id.card_entry_division)
    val join_btn: Button = itemView.findViewById(R.id.card_join_btn)

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

    }

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
    val itemView = LayoutInflater.from(parent.context).inflate(R.layout.contest_item,parent,false)
    return MyViewHolder(itemView,mListener )
}

override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
    val contests = contestlist[position]
    holder.name.text = contestlist[position].name
    holder.entry.text = contestlist[position].entry
    holder.prize.text = contestlist[position].prize
    holder.team.text = contestlist[position].team
    holder.time.text = contestlist[position].time
    holder.venue.text = contestlist[position].venue
    holder.join_btn.text = contestlist[position].total_entry


}

I think you've confused yourself by adding two different ways to set a listener.我认为您通过添加两种不同的方式来设置侦听器而感到困惑。

  1. Your function property var onItemClick您的 function 属性var onItemClick
  2. Your functional interface property private lateinit var mListener .您的功能接口属性private lateinit var mListener

You need to delete one or the other.您需要删除一个或另一个。 The first one is the one you should keep, because you are breaking a couple of conventions with your implementation of the second one, by misusing lateinit and by hiding a property behind setter function.第一个是您应该保留的那个,因为您通过滥用lateinit和隐藏 setter function 后面的属性,在实现第二个时打破了一些约定。

You're already correctly calling onItemClick?.invoke(contestlist[adapterPosition]) in the click listener of each view holder's root view.您已经在每个视图持有者的根视图的点击侦听器中正确地调用onItemClick?.invoke(contestlist[adapterPosition]) You just need to delete this stuff:你只需要删除这些东西:

private lateinit var mListener: onItemClickListener
interface onItemClickListener{
    fun onItemClick(position: Int)
}

fun setOnItemClickListener(listener: onItemClickListener){
    mListener = listener
}

and delete the listener parameter in your ViewHolder constructor.并删除 ViewHolder 构造函数中的listener器参数。

The class that creates the adapter (your Activity or Fragment) can set a lambda as the value of your adapter's onItemClick property and do the effect there:创建适配器(您的 Activity 或 Fragment)的 class 可以将 lambda 设置为适配器的onItemClick属性的值,并在那里执行效果:

adapter.onItemClick = { contest ->
    // do something like open another fragment
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM