Как передать аргумент функции в привязке данных?

1

У меня есть две переменные в моем файле макета:

<data>
  <variable name="createExpenseViewModel" type="com.lionosur.dailyexpenses.viewModels.MainViewModel"/>
  <variable name="createExpenseConverter" type="com.lionosur.dailyexpenses.converters.createExpenseActivityConverter.Companion"/>
</data>

В моей модели представления есть метод для возврата живых данных:

fun getAllExpenseItems(): LiveData<List<Expense>> {
    return expenseRepository.getAllExpenseItems()
}

Мне нужно наблюдать за этими данными и заполнять счетчик,

class createExpenseActivityConverter {
    // contains all the static methods to convert the data for the ui
    companion object {

        fun getExpenseCategoryListFromSource(list:List<Source>):ArrayList<String> {
            val categoryItems = ArrayList<String>()
            categoryItems.addAll(list.map { it.sourceName })
            return categoryItems
        }
    }
}

чтобы заполнить счетчик мне нужно предоставить список строк массива

<Spinner
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:id="@+id/expense_category"
        android:entries="@{()-> createExpenseViewModel.getAllSourceItems(1) }"
        app:layout_constraintStart_toStartOf="@+id/textView"
        android:layout_marginTop="20dp"
        app:layout_constraintTop_toBottomOf="@+id/textView" app:layout_constraintWidth_percent="0.7"
/>

в Android: записи мне нужно преобразовать наблюдаемые данные в список строк массива, как я могу передать результат @{()-> createExpenseViewModel.getAllSourceItems(1) } в другой статический метод createExpenseViewConverter.getExpenseCategoryListFromSource(sourceList) который будет возвращать список массивов строк.

в моей деятельности у меня есть настройка привязки, как это

binding = DataBindingUtil.setContentView(this, R.layout.activity_create_expense)



val mainViewModel =  DaggerExpenseComponent.builder()
    .setContext(this)
    .build()
    .getExpenseViewModel()

binding.setLifecycleOwner(this)
binding.createExpenseViewModel = mainViewModel
Теги:
kotlin
android-databinding

1 ответ

0

Для этого вам нужно будет использовать следующий синтаксис:

android:entries="@{createExpenseConverter.getExpenseCategoryListFromSource(createExpenseViewModel.getAllSourceItems(1))}"

Здесь мы MainViewModel к вашему входу из объекта MainViewModel createExpenseViewModel с помощью getAllSourceItems();

А затем, передав его в другой класс createExpenseActivityConverter создайте метод createExpenseConverter с помощью метода getExpenseCategoryListFromSource() который возвращает ArrayList<String> который требуется вашему счетчику.


Редактировать:

Когда вы используете LiveData в DataBinding, компилятор привязки данных заботится об обновлении данных точно так же, как ObservableFields. Все, что вам нужно сделать, это предоставить свой LifeCycleOwner вашему объекту привязки данных.

Например:

Если ваша активность имеет ViewDataBinding скажем, mActivityBinding, используя которую вы предоставляете свою ViewModel для установки LiveData в привязке xml, то после настройки вашей ViewModel рассмотрите возможность установки LifecycleOwner как LiveData ниже:

//Some Activity having data-binding
... onCreate() method of activity
    mActivityBinding.setViewModel(myViewModel);
    mAcivityBinding.setLifecycleOwner(this); // Providing this line will help you observe LiveData changes from ViewModel in data-binding.
...

Обратитесь сюда

  • 0
    createExpenseViewModel.getAllSourceItems (1) возвращает живые данные, не нужно ли мне их наблюдать?
  • 0
    Нет, это будет обработано компилятором привязки данных внутри.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню