如何在Kotlin中的Adapter中提供长按监听器

4

我该如何在Adapter中实现长按监听器?我已经通过接口实现了onClickLister。但是我不知道如何实现长按监听器。

这是适配器

class DokladAdapter(private val listener: OnItemClickListener): ListAdapter<DokladTuple, DokladAdapter.PolozkaViewHolder>(DiffCallback()) {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PolozkaViewHolder {
        val binding = DokladyItemBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return PolozkaViewHolder(binding)
    }

    override fun onBindViewHolder(holder: PolozkaViewHolder, position: Int) {
        val currentItem = getItem(position)
        if (currentItem != null) {
            holder.bind(currentItem)
        }
    }

    inner class PolozkaViewHolder(private val binding: DokladyItemBinding): RecyclerView.ViewHolder(binding.root) {
        init {
            binding.root.setOnClickListener{
                val position = bindingAdapterPosition
                if (position != RecyclerView.NO_POSITION){
                    val item = getItem(position)
                    if (item != null){
                        listener.onItemClick(item)
                    }
                }
            }
        }
        fun bind(polozkaHlavicka: DokladTuple){
            binding.apply {
                tvU.text = "U"
                tvDOKL.text = polozkaHlavicka.doklad.toString()
                //tvODB.text = "200"
                tvORG.text = polozkaHlavicka.odj.toString()
                tvDATUM.text = polozkaHlavicka.datuct.toString()
            }
        }
    }
    interface OnItemClickListener{
        fun onItemClick(polozkaHlavicka: DokladTuple)
    }

    class DiffCallback: DiffUtil.ItemCallback<DokladTuple>(){
        override fun areItemsTheSame(oldItem: DokladTuple, newItem: DokladTuple) =
            oldItem.doklad == newItem.doklad

        override fun areContentsTheSame(oldItem: DokladTuple, newItem: DokladTuple) =
            oldItem == newItem
    }
}

我在Activity中有一个覆盖函数。
class Activity: AppCompatActivity(), PolozkaAdapter.OnItemClickListener{
override fun onItemClick(polozkaDoklad: PolozkaTuple) {
        //TODO - do something
    }
}

1
除了使用 setOnClickListener 之外,完全按照相同的方式操作,改用 setOnLongClickListener。您需要第二个接口。 - Tenfour04
所以在binding.root的init块中,我可以创建第二个binding.root.setOnLongClickListener。我是对的吗? - jenik2205
1
Yes................. - Tenfour04
2个回答

8
使用 Kotlin ,我这样做,不需要添加监听器接口,我发现它更易读且易于使用,以下是我的示例代码,您可以将其调整为适用于您的适配器和对象。
对于此示例,我有一个Cycle对象,您可以将其替换为您自己的对象。我声明了两个变量。
var onItemClick: ((Cycle) -> Unit)? = null
var onItemLongClick: ((Cycle) -> Unit)?= null

然后在视图持有者中

init {
            itemView.setOnClickListener{
                onItemClick?.invoke(cycleList[adapterPosition])
            }
        itemView.setOnLongClickListener {
            onItemLongClick?.invoke(cycleList[adapterPosition])
            return@setOnLongClickListener true
        }

    }

我可以在任何地方像这样使用它:

    cycleAdapter= CycleAdapter(cycleList)
    binding.cyclesRecyclerView.adapter=cycleAdapter
    cycleAdapter.onItemClick={
       Toast.makeText( requireContext(),it.cycleName, Toast.LENGTH_SHORT).show()
    }
    cycleAdapter.onItemLongClick={
      Toast.makeText( requireContext(),it.cycleName, Toast.LENGTH_SHORT).show()
    }

"it" 在此指代所点击的项目对象,对我来说,它是所点击的循环。

在viewHolder的init{}块中不要使用adapterPosition、absoluteAdapterPosition或bindingAdapterPosition。位置始终为-1! - charman
那时候是有效的,已经过去将近两年了,你可以更新答案并发布出来。 - Zea

2

将您的OnItemClickListener更新以包括长按处理程序,如下所示:

interface OnItemClickListener{ 
    fun onClick(polozkaHlavicka: DokladTuple)
    fun onLongClick(polozkaHlavicka: DokladTuple)
}

现在在PolozkaViewHolderinit中,添加longClickListener如下:
binding.root.setOnLongClickListener{
    // get position data and call long click handler 
    //listener.onLongClick()
    true
}

最后更新ActivityOnItemClickListener的实现,以支持onLongClick


当我在binding.root init块中提供setOnLongClickListener时,我会收到一个错误:类型不匹配。需要:Booleanp 找到:Unit。我有与setOnClickListener相同的代码。 - jenik2205
setOnLongClickListener必须返回一个布尔值,表示是否消耗了点击事件,在您的情况下,您可以返回true。 - mightyWOZ
但我应该在哪里插入它? - jenik2205
1
我已经更新了答案,在onLongClick块的最后一行简单地写入true即可。 - mightyWOZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接