为什么我不能在这个 recyclerview 适配器中设置 setOnLongClick?

why can't I set a setOnLongClick in this recyclerview adapter?

问题:我还没有找到可行的解决方案,并允许我在我的 recyclerview 适配器中使用 onLongClickListener

我知道我的选择似乎是实现一个接口或使用 lambda,但是我一直在尝试我能找到的一切,并且 none 它们正在工作。

我尝试过以下解决方案的地方:

Item Onclick RecyclerView Kotlin Android

RecyclerView onClick in kotlin

以及在谷歌搜索“kotlin recyclerview onClickAdapter”时我能找到的所有其他内容

我在每个解决方案中都遇到了不同的错误,但主要的收获是 none 它们都在工作,这告诉我我的适配器代码可能有问题。

我得到的一个错误示例:如果我尝试在 TaskViewHolderbind 函数中使用 setOnClickListener,我会得到

的错误

Wrong return type, expecting Boolean, received Unit

没有传入列表,因为我使用带有房间数据库的视图模型中的 submitList

适配器代码基于 Room with a View code

我有

适配器代码:

class TaskRvAdapter : ListAdapter<Task, TaskRvAdapter.TaskViewHolder>(TaskComparator()) {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TaskViewHolder {
        return TaskViewHolder.create(parent)
    }

    override fun onBindViewHolder(holder: TaskViewHolder, position: Int) {
        val current = getItem(position)
        holder.bind(current.task)
    }

    class TaskViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        private val taskItemView: TextView = itemView.findViewById(R.id.task_rv_item)

        fun bind(text: String?) {
            taskItemView.text = text
        }

        companion object {
            fun create(parent: ViewGroup): TaskViewHolder {
                val view: View = LayoutInflater.from(parent.context)
                        .inflate(R.layout.task_rv_item, parent, false)
                return TaskViewHolder(view)
            }
        }
    }

    class TaskComparator : DiffUtil.ItemCallback<Task>() {
        override fun areItemsTheSame(oldItem: Task, newItem: Task): Boolean {
            return oldItem === newItem
        }

        override fun areContentsTheSame(oldItem: Task, newItem: Task): Boolean {
            return oldItem.task == newItem.task
        }
    }
}

尝试使用此代码,格式正确

    fun bind(text: String?) {
        taskItemView.text = text
        itemView.setOnClickListener {
            Log.i("TaskRvAdapter", "item clicked: "+text)
        }
        itemView.setOnLongClickListener{
            Log.i("TaskRvAdapter", "item long clicked: "+text)
            return@setOnLongClickListener true
        }
    }