У меня есть две переменные в моем файле макета:
<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
Для этого вам нужно будет использовать следующий синтаксис:
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.
...
Обратитесь сюда