我有一个具有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
而不是一个函数。
答案 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
}
}