簡體   English   中英

在 recyclerView 適配器內處理按鈕單擊

[英]handle button click inside recyclerView adapter

我有一個名為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 適配器中實現監聽器

處理適配器的項目單擊的一個很好的解決方案是將它們傳遞給創建它們的活動或片段。

使用 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 ) 中設置偵聽器效率更高,因為不需要為每個數據綁定設置偵聽器。

我想你應該添加一個擴展列表。 這是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) }*
}

您必須在onBindViewHolder()中處理它,但負責創建和顯示AlertDialog的邏輯不應位於 RecyclerView 中。 您需要創建一個接口,該接口負責將onClick()事件信息從適配器傳遞到活動/片段,並且您應該在那里顯示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)

現在通過OnClickListener setListener()方法將 OnClickListener 的實例從您的活動傳遞給您的適配器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM