У меня есть root FastAdapter
, который содержит элементы MultipleChoiceQuestionitem
, которые расширяют AbstractBindingItem
. Этот элемент содержит RecyclerView
, которым я управляю с помощью другого FastAdapter
, а этот заполнен другим элементом с именем MultipleChoiceItem
.
Я хочу распространять клики вверх с MultipleChoiceItem
на прикрепленный обработчик событий на root FastAdapter
, чтобы я мог точно знать, какой вариант выбрал пользователь. Вот что я пробовал.
abstract class MultipleChoiceSelectionEventHook : CustomEventHook<MultipleChoiceQuestionItem>() {
override fun onBind(viewHolder: RecyclerView.ViewHolder): View? {
return if (viewHolder is BindingViewHolder<*> && viewHolder.binding is ItemMultipleChoiceQuestionBinding)
(viewHolder.binding as ItemMultipleChoiceQuestionBinding).recycler
else null
}
override fun attachEvent(view: View, viewHolder: RecyclerView.ViewHolder) {
((view as RecyclerView).adapter as FastAdapter<*>).onClickListener = { _,_,item,_ ->
if (item is MultipleChoiceItem) choiceSelected(item.id!!)
false
}
}
abstract fun choiceSelected(choiceId: String)
}
Теперь это не работает во время выполнения, потому что на этом этапе RecyclerView
не имеет набора адаптеров, и все, что у нас есть, это View
классы из макета. Поэтому я получаю NullPointerException
на ((view as RecyclerView).adapter
.
Я думаю, мне нужен какой-то способ запуска этого обработчика событий после того, как я установил адаптер в методе MultipleChoiceQuestionItem::bindView()
. Если это вообще возможно ...
Я добавляю обработчик событий к быстрому адаптеру root вот так.
fastAdapter.addEventHook(object : MultipleChoiceQuestionItem.MultipleChoiceSelectionEventHook() {
override fun choiceSelected(choiceId: String) {
TODO("Do something with this choice:$choiceId")
}
})