【问题标题】:Itemclicklistener on recyclerview item in kotlinkotlin 中 recyclerview 项目上的 Itemclicklistener
【发布时间】:2023-01-30 21:46:43
【问题描述】:

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

这就是我的适配器类的样子

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


}

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

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

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

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

      您已经在每个视图持有者的根视图的点击侦听器中正确地调用了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)的类可以将 lambda 设置为适配器的 onItemClick 属性的值并在那里执行效果:

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

    【讨论】:

      猜你喜欢
      • 2020-12-31
      • 2015-06-08
      • 2021-10-27
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      相关资源
      最近更新 更多