Kotlin Android Studio - обрабатывать нажатие кнопки внутри программы recyclerView - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть адаптер recyclerView с именем ArticleAdapter

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 ]

0 голосов
/ 09 декабря 2018

Вы должны обработать это в 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() методом.

0 голосов
/ 10 декабря 2018

Хорошим решением для обработки щелчков элементов адаптера является передача их в действие или фрагмент, который их создал.

С 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) более эффективна, так как нет необходимости устанавливатьслушатель для каждой привязки данных.

0 голосов
/ 09 декабря 2018

Полагаю, вам следует добавить дополнительный список.Вот 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) }*
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...