Обработка setOnClickListener и setOnLongClickListener в адаптере Kotlin

Я пытаюсь использовать 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)
        }

Просто передайте boolean как для длинного клика, так и для onClick

Santanu Sur 30.05.2019 09:42

Я пытался передать логическое значение, подобное этому (listener (urlData, true)) в MyViewHolder, но код дает сбой в Activity (presenter.onItemClick (it)) неразрешенной ссылке «it». Не могли бы вы ввести код, как это сделать, пожалуйста

S.P. 30.05.2019 09:46
0
2
697
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предлагаю вам добавить слушателей в 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) 

Другие вопросы по теме