#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. На самом деле я уже пробовал это, но, как ни странно, щелчок зарегистрировался только в первом элементе списка представления переработчика.