Распространение перехватчика события из вложенного FastAdapter в родительский FastAdapter - PullRequest
0 голосов
/ 17 июня 2020

У меня есть 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")
                    }
                })
...