当前位置: 首页 > 知识库问答 >
问题:

为什么我不能在这个回收器视图适配器中设置一个setOnLongClick?

施靖
2023-03-14

问题是:我还没有找到一个有效的解决方案,允许我在我的recyclerview适配器中使用onLongClickListener

我知道我的选择似乎要么是实现一个接口,要么是使用lambda,然而我一直在尝试我能找到的一切,但没有一个是有效的。

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

项目Onclick RecyclerView Kotlin Android

科特林的RecyclerView onClick

如何将点击监听器添加到我的回收器视图(Android kotlin)

静态编程语言

回收站卡项目OnClick静态编程语言

以及我在谷歌上搜索“点击适配器上的kotlin回收器视图”时能找到的其他一切

每种解决方案都会出现不同的错误,但主要的收获是它们都不起作用,这告诉我,从一开始,我的适配器代码可能有问题。

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

错误的返回类型,期望布尔,收到单位

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

适配器代码基于房间外的视图代码

我有过

适配器代码:

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
        }
    }
}

共有1个答案

阎功
2023-03-14

请尝试使用正确格式化的代码

    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
        }
    }
 类似资料: