Как обрабатывать щелчки по представлению внутри элемента списка RecyclerView. Использование привязки данных и kotlin

#android #kotlin #android-recyclerview #android-databinding

#Android #котлин #android-recyclerview #android-привязка данных

Вопрос:

Все ресурсы, которые я нашел, либо на Java, либо охватывают только сам элемент списка, а не представление внутри элемента списка. Я полагаю, что я должен настроить это внутри класса ViewHolder, но я не уверен, как это сделать. Это мой класс наблюдателей.

 class ItemListAdapter(val clickListener : ItemListListener) : ListAdapterlt;Item , ItemListAdapter.ItemViewHoldergt;(DiffCallback) {  class ItemViewHolder(private var binding : ItemListItemBinding) :  RecyclerView.ViewHolder(binding.root) {  fun bind(item : Item, clickListener : ItemListListener) {   binding.item = item  binding.clickListener = clickListener    // button that inside listItem that I want to respond to clicks  // binding.addOneButton ???????     binding.executePendingBindings()  } }  

И мой слушатель

 class ItemListListener(val clickListener : (singleItem : Item) -gt; Unit) {  fun onClick(item : Item){   clickListener(item)   }  

}

Другие вызовы методов, если они актуальны

 override fun onBindViewHolder(holder : ItemViewHolder , position : Int) {  val item = getItem(position)  holder.bind(item, clickListener) }  companion object DiffCallback : DiffUtil.ItemCallbacklt;Itemgt;() {  override fun areItemsTheSame(oldItem : Item , newItem : Item) : Boolean {  return oldItem == newItem  }   override fun areContentsTheSame(oldItem : Item , newItem : Item) : Boolean {  return oldItem.itemId == newItem.itemId  } }  override fun onCreateViewHolder(  parent : ViewGroup ,  viewType : Int ) : ItemViewHolder {  return ItemViewHolder(ItemListItemBinding.inflate(LayoutInflater.from(parent.context))) }  

Комментарии:

1. Что такое binding.clickListener ? У вас есть что-то с этим именем в вашем XML?

2. Это мой список элементов из второй группы кода выше.

3. Я имел в виду, как вы используете его в своем XML? Вы установили его в качестве onClick атрибута кнопки xml?

4. Он задается как onClick для корневого представления элемента списка, как ограничение.

5. Вам нужны два прослушивателя щелчков мыши? Один для корневого представления и один для addOneButton ?

Ответ №1:

Прежде всего, Прослушиватель должен быть интерфейсом.

 interface ItemListListener {  fun onClick(item: Item,actionType:String)  }  

Затем в классе Activity/Fragment реализуйте этот интерфейс. Инициализируйте адаптер.

 recyclerView.adapter = ItemListAdapter(this)  

Вы можете обновить свой класс ItemViewHolder следующим кодом. Сделайте это внутренним классом, тогда вам не нужно будет передавать экземпляр ClickListener. И прослушиватель щелчка должен быть зарегистрирован в методе инициализации класса держателя представления.

 inner class ItemViewHolder(private val binding : ItemListItemBinding) :  RecyclerView.ViewHolder(binding.root) {   init {  binding.addOneButton.setOnClickListener {  clickListener.onClick(getItem(adapterPosition),"button")  }  binding.root.setOnClickListener {  clickListener.onClick(getItem(adapterPosition),"root")  }  }  fun bind(item : Item) {  binding.item = item  binding.executePendingBindings()  }  }  

** Обновление **

После некоторых исследований я получил ответ на ваш вопрос. Вот решение. Вместо интерфейса вы можете передать функцию более высокого порядка в класс адаптера.

 class ItemListAdapter(val clickListener : (Item,String) -gt; Unit ):ListAdapterlt;Item , ItemListAdapter.ItemViewHoldergt;(DiffCallback)  

В классе держателя представления

 binding.addOneButton.setOnClickListener {  clickListener(getItem(adapterPosition),"button")  }  binding.root.setOnClickListener {  clickListener(getItem(adapterPosition),"root")  }  

В Действии/Фрагменте

 recyclerview.adapter = ItemListAdapter({item, action-gt; })  

Вы также можете сделать это с помощью привязки.

Комментарии:

1. Я пытался избежать создания интерфейса. Я слышал, что в Котлине есть другой способ его реализации.

2. Интерфейс @brandNoob или Прослушиватель привязки внутри XML-это два способа сделать это. Я не знаю, о чем вы говорите по-другому. Также, если вы хотите обработать корневой просмотр, нажмите кнопку «Добавить» и нажмите кнопку «Добавить» отдельно. Затем вы можете добавить еще один параметр в метод onClick класса интерфейса. Я обновил ответ, который вы можете проверить.

Ответ №2:

если это щелчок по элементу, который вы можете установить на onBindViewHolder

 holder.itemView.setOnClickListener {  clickListener.onClick(getItem(position) }  

Если вам нужен определенный вид внутри вашего элемента, вы можете установить bind функцию

 fun bind(item : Item, clickListener : ItemListListener) {  binding.item = item  binding.addOneButton.setOnClickListener {  clickListener.onClick(item)  }    binding.executePendingBindings() }  

Комментарии:

1. На самом деле я уже пробовал это, но, как ни странно, щелчок зарегистрировался только в первом элементе списка представления переработчика.