【问题标题】:Handle setOnClickListener and setOnLongClickListener in Kotlin adapter在 Kotlin 适配器中处理 setOnClickListener 和 setOnLongClickListener
【发布时间】:2019-06-29 18:48:21
【问题描述】:

我正在尝试在适配器中使用 setOnClickListener 和 setOnLongClickListener 将点击传递给活动。我已经搜索了很多,但我只找到了一些关于如何做一个 clicklistener 但不能同时处理两个的例子。

如何处理活动中的两个侦听器?

适配器

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
  • 我试图在 MyViewHolder 中传递一个像这样的布尔值 (listener(urlData, true)),但代码在 Activity (presenter.onItemClick(it)) 中崩溃,无法解析引用 'it'。请您输入一些代码来说明如何操作

标签: android kotlin android-recyclerview


【解决方案1】:

活动的 lambda 函数应如下所示:-

val listener : (String, Boolean) -> Unit = { urlData, isLongClick -> presenter.onItemClick(urlData) }

然后将 lambda (listener) 传递给适配器

rv_web_items.adapter = BrowserAdapter(Preferences.getFavouritesWebsites(), listener) 

【讨论】:

    【解决方案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)
            }
    

    那么在activity中你必须声明这个接口:

     val adapter = Adapter(..., ..., this@YourActivity)
    

    获取活动数据的函数:

    override fun sendData(your_data) {
        }
    

    别忘了实现这个接口:

    class JobsList : ..., ..., Click
    

    希望对你有所帮助。祝你好运:)

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2012-11-08
      • 2018-01-28
      • 2020-12-29
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多