[репост из моего ответа на Reddit - вы сказали, что вас это смутило - можете ли вы рассказать, какие части вас смутили?]
Мы делаем нечто подобное ...
Это хорошо работает для нас. Мы создали класс «виджетов» для каждого типа отображаемых объектов - это будут ваши типы вопросов (я рекомендую создать базовый класс Question) - это строго данные, без ссылок Android. Вы создадите список из них, чтобы представить форму на экране, и передадите этот список адаптеру переработчика просмотра (я опишу его ниже).
Назначьте каждому типу вопроса уникальное целое число; это будет тип представления элемента, используемый в адаптере.
Затем создайте подкласс RecyclerView.ViewHolder, который имеет функцию связывания, которая примет ваш тип вопроса. Что-то вроде
абсолютный класс QuestionViewHolder: ViewHolder {abstract fun bind (question: QUESTION_TYPE)} *
Затем создайте подкласс QuestionViewHolder для каждого типа данных (передав его в качестве квалификатора типа), с соответствующий макет для каждого. Держатель представления должен иметь функцию связывания, которая будет передавать объект вопроса и устанавливать данные в макете. Затем держатель представления может обновлять данные в объекте вопроса, когда пользователь вносит изменения.
Создание адаптера для представления переработчика. Ключевым моментом здесь является реализация getItemViewType (int) - вы посмотрите, какой вопрос находится на этой позиции, и вернете целое число, представляющее тип вопроса. Вам нужно будет указать тип держателя вида, возможно, QuestionViewHolder (возможно, вам придется поиграться с обобщенными типами c, как только вы начнете ... Если генерики вызывают проблемы, и они могут b / c, то это дисперсию "in", отбросьте тип generi c в QuestionViewHolder, передав в параметре Question функцию Bind, и приведите его к типу, необходимому для каждого подкласса ... Мне пришлось поиграть с нашим довольно немного, чтобы обобщить все классы - это может не стоить усилий, и вы можете просто привести функцию bind ...)
В onCreateViewHolder адаптера создайте экземпляр ViewHolder, который соответствует Передан itemViewType.
В адаптере onBindViewHolder просто найдите вопрос для отображения и передайте его функции связывания, созданной вами в держателе представления.
И в этом суть .. .
Другой вариант - просто создать представления и добавить их в длинный LinearLayout, но если форма длинная, производительность может быть плохой - вид переработчика хорош b / c, он может использовать одни и те же блоки вопросов.
Удачи!