Android将查询参数传递给ViewModel

时间:2019-09-12 05:37:07

标签: android kotlin android-livedata android-mvvm

我有一个具有2种功能的视图和视图模型-

1)单击视图中的按钮并获取数据。

2)一个微调器,您可以在其中选择一个项目,并要求视图模型获取该项目的数据作为查询参数。

我已经实现了第一点-

MyView代码-

viewModel.onGetDataClicked.observe(this, Observer {
    //....
})

我的ViewModel代码-

private val viewState = MyViewState()

    val onGetDataClicked =
        Transformations.map(dataDomain.getData(MyAction.GetDataAction)) {
            when (it) {
                ....
            }
        }

MyAction代码-

sealed class MyAction : Action {
    object GetDataAction : MyAction()
}

我的问题是如何将微调器值从视图传递到视图模型?由于在视图模型中,我有一个val onGetDataClicked而不是一个函数。

2 个答案:

答案 0 :(得分:1)

首先,您应该在视图本身中获取项目值,然后将项目值传递到ViewModel中的必需方法,然后从ViewModel传递到存储库(从中查询数据)。

    // in view
    viewModel.onGetDataClicked(item:DataType).observe(this, Observer {
        //....
    })

    //in viewmodel
    private val viewState = MyViewState()

        val onGetDataClicked:(item:DataType) =
          Transformations.map(dataDomain.getData(MyAction.GetDataAction)) {

    //you have item here, pass it where you require
                when (it) {
                    ....
                }
            }

答案 1 :(得分:0)

您好,您可以使用视图中的selectedItemPosition属性并将位置传递给viewModel,因此您可以使用该位置映射项目。

layout.xml

<?xml version="1.0" encoding="utf-8"?>

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <data class="FeedbackBinding">

        <variable
            name="vm"
            type="com.ec.service.ServiceViewModel" />
    </data>
            <androidx.appcompat.widget.AppCompatSpinner
                android:id="@+id/unitAET"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginTop="8dp"
                android:selectedItemPosition="@={vm.selectedUnitPosition}"
                app:entries="@{vm.unitNames}"
                app:layout_constraintEnd_toEndOf="@+id/textView10"
                app:layout_constraintStart_toStartOf="@+id/textView10"
                app:layout_constraintTop_toBottomOf="@+id/textView10" />

        </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

selectedUnitPosition是MutableLeveData

fragment.kt

在片段中初始化vm(viewModel)

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    withViewModel<ServiceViewModel>(factory) {
        binding.vm = this
    }
}
相关问题