在Kotlin适配器中处理setOnClickListener和setOnLongClickListener

时间:2019-05-30 07:24:29

标签: android kotlin android-recyclerview recycler-adapter

我正在尝试在适配器中使用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)
        }

2 个答案:

答案 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

我希望它将对您有所帮助。祝你好运:)