如何在数据绑定中将参数传递给函数?

时间:2019-04-20 06:10:37

标签: android kotlin android-databinding

我的布局文件中有两个变量:

<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:entries 中,我需要将观察到的数据转换为字符串数组列表,如何将@{()-> 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 :(得分:0)

您需要为此使用以下语法:

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

在这里,我们完成的工作是使用MainViewModel方法从getAllSourceItems()对象 createExpenseViewModel 中访问您的输入;

然后使用方法createExpenseActivityConverter将其传递给另一个类getExpenseCategoryListFromSource()对象 createExpenseConverter ,该方法将返回您的微调器所需的ArrayList<String>


编辑:

DataBinding 中使用LiveData时,数据绑定编译器会像 ObservableFields 一样负责刷新数据。您需要做的就是将LifeCycleOwner提供给数据绑定对象。

例如:

如果您的活动有ViewDataBinding,请说 mActivityBinding ,通过它您可以提供ViewModel来设置xml绑定中的LiveData,然后设置{{1 }}像下面的代码一样考虑设置ViewModel

LifecycleOwner

引用here