首页 > 解决方案 > 如何在 Kotlin 的 RecyclerView 上实现 longClickListen

问题描述

在搜索了几个小时的解决方案后,我可以实现 ItemClickListener,但由于某种原因,我不能使用相同的方法来实现 itomLongClickListener。它给了我“类型不匹配”错误:类型不匹配。必需:布尔值 找到:单位

如果您能指出我做错了什么,我将不胜感激。

下面是我的代码

class MyAdapter(ct: Context, s1: Array<String>, s2: Array<String>?):RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
    var nameList: Array<String>? = null
    var oneLineMessage: Array<String>? = null
    var context: Context? = null

    init {
        nameList = s1
        oneLineMessage = s2
        context = ct

    }

    fun onClick(view :View){
        val intent= Intent(context,SecondPage::class.java)
        context?.startActivity(intent)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
        var inflater = LayoutInflater.from(context)
        var v = inflater.inflate(R.layout.my_row, parent, false)
        return MyViewHolder(v)
    }

    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        holder.friendName?.text = nameList?.get(position)
        if (oneLineMessage != null) {
            holder.messagePreview?.text = oneLineMessage?.get(position)
        } else {
            holder.messagePreview?.visibility = View.GONE
        }
        holder.layout?.setOnClickListener(View.OnClickListener {
            val intent= Intent(context,SecondPage::class.java)
            context?.startActivity(intent)
        })
    }

    override fun getItemCount(): Int {
        return nameList?.size as Int
    }

    inner class MyViewHolder constructor(itemView: View) : RecyclerView.ViewHolder(itemView) {
        var friendName: TextView? = itemView.findViewById(R.id.nameText)
        var messagePreview: TextView? = itemView.findViewById(R.id.messagePreview)
        var layout: RelativeLayout? = itemView.findViewById(R.id.secondPageConstraintLayout)

        init {
            
            itemView.setOnClickListener{
                val position=adapterPosition+1
                Toast.makeText(context, "you chose $position", Toast.LENGTH_SHORT).show()
            }
            
            itemView.setOnLongClickListener(View.OnLongClickListener {
                val position=adapterPosition+1
                Toast.makeText(context, "you long pressed $position", Toast.LENGTH_SHORT).show()  })
        }


    }
}

标签: androidkotlinandroid-recyclerviewonitemlongclicklistener

解决方案


View.OnLongClickListner是一个接口boolean onLongClick(View v),这意味着你必须返回boolean

如果回调消耗了长按,则返回 true,否则返回 false。

show()返回Unit,这是您的 lambda 中的最后一行{}

所以如果你在你itemView刚刚返回的时候消耗了长按true

itemView.setOnLongClickListener {
    val position=adapterPosition+1
    Toast.makeText(context, "you long pressed $position", Toast.LENGTH_SHORT).show()
    true
}

推荐阅读