首页 文章

Kotlin Android Studio - 处理按钮单击recyclelerView适配器

提问于
浏览
1

我有一个名为 ArticleAdapter 的recyclerView适配器

import kotlinx.android.synthetic.main.articlerecycler_item.view.*


class ArticleAdapter(private val controller: IController) : RecyclerView.Adapter<ArticleViewHolder>() {

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
      val view = LayoutInflater.from(parent.context).inflate(R.layout.articlerecycler_item, parent, false)
      return ArticleViewHolder(view)


  }
    // How implement a button click for `btnSave`
    /** Called when the user taps the Save button  */
     btnSave.setOnClickListener(){
        (R.layout.articlerecycler_item)
        AlertDialog.Builder(this)
                .setMessage("Article Saved.")
                .create()
                .show()
        // Do something in response to button click
    }

  override fun getItemCount(): Int {
      return controller.articles.size
  }

  override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {

      val article: Article = controller.articles[position]

      if(article.title.length > 100) {
        holder.itemView.titleTv.text = "${article.title.substring(0, 99)}..."
      } else {
        holder.itemView.titleTv.text = article.title
      }

      holder.itemView.authorTv.text = article.author
  }

}
class ArticleViewHolder(view: View?) : RecyclerView.ViewHolder(view)

然后在我的recyclerView布局中,我有一个按钮

<Button
    android:id="@+id/btnSave"
    android:layout_width="70dp"
    android:layout_height="40dp"
    android:onClick="btnSave"
    android:text="@string/save"
    android:textAlignment="center" />

我在 onBindViewHolder 内处理这个事件吗?我不确定如何在我的recyclerView适配器中实现监听器

3 回答

  • 1

    我想你应该添加一个扩展列表 . 这是https://dzone.com/articles/click-listener-for-recyclerview-adapter . 此外,您必须为保存按钮添加自定义列表器 .

    override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
    
      val article: Article = controller.articles[position]
    
      if(article.title.length > 100) {
        holder.itemView.titleTv.text = "${article.title.substring(0, 99)}..."
      } else {
        holder.itemView.titleTv.text = article.title
      }
    
      holder.itemView.authorTv.text = article.author
    
    
      *holder.btnSave.setOnClickListener(){_ ->
        **yourCustomListener**.OnClick(data/position) }*
    }
    
  • 1

    处理适配器项目点击的一个很好的解决方案是将它们传递给创建它们的活动或片段 .

    使用kotlin,您可以使用函数定义而不是接口来完成这项简单的工作,因此在您的适配器类中添加函数类型的 var

    private var listener: ((item: DataClass) -> Unit)? = null
    
    fun setOnItemClickListener(listener: (item: DataClass) -> Unit) {
        this.listener = listener
    }
    

    ViewHolder 类中设置了监听器,如下所示:

    class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        init {
            itemView.btn_save.setOnClickListener { listener?.invoke(data[adapterPosition]) }
        }
    
        // ...
    }
    

    最后,在您的活动或片段中,您可以通过添加新的侦听器轻松访问项目:

    adapter.setOnItemClickListener { it -> TODO() }
    

    请注意,在 ViewHolder 构造函数( init )中设置侦听器更有效,因为不必为每个数据绑定设置侦听器 .

  • 1

    您必须在 onBindViewHolder() 中处理它,但负责创建和显示 AlertDialog 的逻辑不应位于RecyclerView中 . 您需要创建一个接口,该接口负责将适配器中的 onClick() 事件信息传递给activity / fragment,并且您应该显示 AlertDialog .

    class ArticleAdapter(private val controller: IController) : RecyclerView.Adapter<ArticleViewHolder>() {
    
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ArticleViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.articlerecycler_item, parent, false)
        return ArticleViewHolder(view)
    }
    
    override fun getItemCount(): Int {
        return controller.articles.size
    }
    
    override fun onBindViewHolder(holder: ArticleViewHolder, position: Int) {
        val article: Article = controller.articles[position]
    
        if(article.title.length > 100) {
            holder.itemView.titleTv.text = "${article.title.substring(0, 99)}..."
        } else {
            holder.itemView.titleTv.text = article.title
        }
    
        btnSave.setOnClickListener {
            listener?.onSaveButtonClick()
        }
    
        holder.itemView.authorTv.text = article.author
    }
    
    private var listener: OnClickListener? = null
    
    fun setListener(listener: OnClickListener) {
        this.listener = listener
    }
    
    }
    
    interface OnClickListener {
        fun onSaveButtonClick()
    }
    
    class ArticleViewHolder(view: View?) : RecyclerView.ViewHolder(view)
    

    现在通过 setListener() 方法将 OnClickListener 的实例从您的活动传递到适配器 .

相关问题