Как передать аргумент функции в привязке данных? - PullRequest
1 голос
/ 20 апреля 2019

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

<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

1 Ответ

0 голосов
/ 20 апреля 2019

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

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

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

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


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

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

Например:

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

//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.
...

См. здесь

...