Добавляйте представления к активности во время выполнения с помощью MVVM в Android

#android #view #android-architecture-components #android-viewmodel #android-mvvm

Вопрос:

В моем приложении много действий. Каждое действие имеет множество элементов пользовательского EditText интерфейса, таких как TextView , DatePicker , и т.д. DropDown Действие содержит как статические компоненты (представления, статически размещенные в xml-макете), так и динамические компоненты (представления, добавляемые во время выполнения на основе бизнес-логики и ответа API). Элементы пользовательского интерфейса, которые будут добавлены в действие, являются динамическими. Какие все элементы пользовательского интерфейса необходимо добавить, зависит от ответа API.

Я подумываю о написании метода, который принимает информацию о том, какие все представления должны быть добавлены в качестве параметра, создает представление и возвращает его как a LinearLayout со всеми добавленными дочерними представлениями.

В приведенном ниже фрагменте кода rowBuilder-это класс данных, в котором хранится информация о представлениях, которые будут добавлены во время выполнения. Метод построит вертикаль linearLayout со всеми необходимыми видами и вернет ее.

 fun getUIFields(context: Context, rowBuilderList: ArrayList<RowBuilder>): LinearLayout {
    val rootVerticalLinearLayout: LinearLayout = getRootVerticalLinearLayout(context)

    for(i in 0 until rowBuilderList.size) {
        val horizontalLinearLayout = getHorizontalLinearLayout(context)
        for (j in 0 until rowBuilderList[i].columnBuilderList.size) {
            val formFieldInfo = rowBuilderList[i].columnBuilderList[j].formFieldInfo
            if (formFieldInfo.formFieldType == FormFieldType.EDIT_TEXT) {
                addEditText(formFieldInfo, horizontalLinearLayout, context, i.toString()   j.toString())
            } else if (formFieldInfo.formFieldType == FormFieldType.DATE_PICKER) {
                addEditTextForDatePicker(formFieldInfo, horizontalLinearLayout, context, i.toString()   j.toString())
            }
        }
        rootVerticalLinearLayout.addView(horizontalLinearLayout, i)
    }
    return rootVerticalLinearLayout
}
 

Где я могу разместить приведенную выше логику, которая требует контекста? Я знаю , что у нас есть AndroidViewModel , где я могу использовать контекст. Кроме того, если я напишу вышеприведенную логику ViewModel , один и тот же код должен быть продублирован в каждом viewmodels . Мне нужно знать о более эффективном подходе с использованием MVVM

Пожалуйста, помогите!

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

1. сначала я бы поместил этот фрагмент кода в действия/фрагменты. Я не вижу никаких причин, по которым это могло бы быть в viewmodel. И во-вторых, может быть, вы могли бы сделать эту функцию расширением активности, чтобы использовать ее повторно?