繁体   English   中英

kotlin 中 recyclerview 项目的 Itemclicklistener

[英]Itemclicklistener on recyclerview item in kotlin

如何通过单击 recyclerview 项目从一项活动移动到另一项活动,并在意图中传递所单击项目的一些详细信息?

这就是我的适配器 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


}

我认为您通过添加两种不同的方式来设置侦听器而感到困惑。

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

您需要删除一个或另一个。 第一个是您应该保留的那个,因为您通过滥用lateinit和隐藏 setter function 后面的属性,在实现第二个时打破了一些约定。

您已经在每个视图持有者的根视图的点击侦听器中正确地调用onItemClick?.invoke(contestlist[adapterPosition]) 你只需要删除这些东西:

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

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

并删除 ViewHolder 构造函数中的listener器参数。

创建适配器(您的 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