我正在尝试在适配器中使用setOnClickListener和setOnLongClickListener将点击传递给活动。我搜索了很多内容,但只发现了一些示例,这些示例说明了如何执行一个单击侦听器,但不能同时处理两者。
如何在活动中同时处理两个侦听器?
预先感谢
适配器
class BrowserAdapter(private val voucherList: List<String>?, private val listener: (String) -> Unit) : RecyclerView.Adapter<BrowserAdapter.MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(inflate(parent.context, R.layout.item_web, parent, false))
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.bind(voucherList!![position], listener)
}
override fun getItemCount(): Int {
return voucherList!!.size
}
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
fun bind(urlData: String, listener: (String) -> Unit) = with(itemView) {
tx_url.text = urlData
itemView.setOnClickListener{
listener(urlData)
}
itemView.setOnLongClickListener{
listener(urlData)
true
}
}
}
}
活动
rv_web_items.adapter = BrowserAdapter(Preferences.getFavouritesWebsites()) {
presenter.onItemClick(it)
}
答案 0 :(得分:1)
该活动的lambda函数应如下所示:-
val listener : (String, Boolean) -> Unit = { urlData, isLongClick -> presenter.onItemClick(urlData) }
然后将lambda(listener
)传递给适配器
rv_web_items.adapter = BrowserAdapter(Preferences.getFavouritesWebsites(), listener)
答案 1 :(得分:0)
我建议您像这样在onBindViewHolder
上添加侦听器:
holder.itemView.setOnClickListener {
}
并长按:
holder.itemView.setOnLongClickListener { true }
,以及如何将数据发送到活动。第一步-创建界面:
interface Click {
fun sendData(..., position: Int, ...) // it is only example
}
第二步,在适配器上使用它:
open class Adapter(..., ..., private val click: Click)
然后处理点击并发送数据:
holder.itemView.setOnClickListener {
click.sendData(your_data)
}
然后在活动中必须声明此接口:
val adapter = Adapter(..., ..., this@YourActivity)
用于获取活动数据的功能:
override fun sendData(your_data) {
}
也不要忘记实现此接口:
class JobsList : ..., ..., Click
我希望它将对您有所帮助。祝你好运:)