Я пытаюсь использовать 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)
}
Я пытался передать логическое значение, подобное этому (listener (urlData, true)) в MyViewHolder, но код дает сбой в Activity (presenter.onItemClick (it)) неразрешенной ссылке «it». Не могли бы вы ввести код, как это сделать, пожалуйста
Я предлагаю вам добавить слушателей в 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
Я надеюсь, что это поможет вам. Удачи :)
Лямбда-функция действия должна выглядеть так: -
val listener : (String, Boolean) -> Unit = { urlData, isLongClick -> presenter.onItemClick(urlData) }
Затем передайте лямбду ( listener
) адаптеру.
rv_web_items.adapter = BrowserAdapter(Preferences.getFavouritesWebsites(), listener)
Просто передайте
boolean
как для длинного клика, так и для onClick