如何在适配器的 Kotlin 中提供长点击监听器
Posted
技术标签:
【中文标题】如何在适配器的 Kotlin 中提供长点击监听器【英文标题】:How to provide long click listener in Kotlin in Adapter 【发布时间】: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。我说的对吗?
是........
【参考方案1】:
更新您的 OnItemClickListener
以包含长点击处理程序
interface OnItemClickListener
fun onClick(polozkaHlavicka: DokladTuple)
fun onLongClick(polozkaHlavicka: DokladTuple)
现在在PolozkaViewHolder
init
,添加longClickListener
为
binding.root.setOnLongClickListener
// get position data and call long click handler
//listener.onLongClick()
true
最后更新Activity
中OnItemClickListener
的实现为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”代表被点击的项目对象,对我来说它是被点击的循环
【讨论】:
以上是关于如何在适配器的 Kotlin 中提供长点击监听器的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin:单击 RecycleView 项目时显示 AlertDialog
如何在Kotlin中处理EditText drawableRight图标的点击监听器?