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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将参数传递给数据绑定中的函数?相关的知识,希望对你有一定的参考价值。

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

<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方法从getAllSourceItems()对象createExpenseViewModel访问您的输入;

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


编辑:

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

例如:

如果你的活动有ViewDataBinding让我们说你使用你的ViewModel在xml绑定中设置LiveData的mActivityBinding,那么在设置你的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.
...

请参阅here

以上是关于如何将参数传递给数据绑定中的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数传递给 kivy 按钮的绑定函数

如何将带参数的函数传递给Angular中的内部组件

如何将不同的参数传递给片段 [导航] Android

如何使用底部导航视图和 Android 导航组件将参数传递给片段?

如何将参数传递给 GraphQL 中的子属性

将多个参数传递给 React 中的事件处理程序