【问题标题】:How to provide long click listener in Kotlin in Adapter如何在适配器的 Kotlin 中提供长点击监听器
【发布时间】:2021-10-03 07:30:44
【问题描述】:

如何在 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
    }
}

【问题讨论】:

  • 除了使用setOnLongClickListener 而不是setOnClickListener 之外,以完全相同的方式进行操作。您需要第二个界面。
  • 所以在 binding.root 初始化块中,我可以创建第二个 binding.root.setOnLongClickListener。我说的对吗?
  • 是........

标签: android kotlin android-recyclerview onclicklistener onlongclicklistener


【解决方案1】:

更新您的 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 初始化块中提供 setOnLongClickListener 时出现错误:类型不匹配。必需:Booleanp 找到:单位。我的代码与 setOnClickListener 中的代码相同
  • setOnLongClickListener 必须返回一个布尔值,表示点击是否被消费,在你的情况下你可以返回 true
  • 但是我应该在哪里插入呢?
  • 我已经更新了答案,只需在onLongClick块的最后一行写true
【解决方案2】:

使用 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”代表被点击的项目对象,对我来说它是被点击的循环

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多