簡體   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