Kotlin 数据绑定和BaseObserver-Android MVVM
我有一个textfield,它被数据绑定到一个视图模型,比如这里的xml,我希望UI在单击cardView时更新txtProvider字段。 我应该如何从viewmodel通知视图的更改Kotlin 数据绑定和BaseObserver-Android MVVM,kotlin,observer-pattern,android-databinding,Kotlin,Observer Pattern,Android Databinding,我有一个textfield,它被数据绑定到一个视图模型,比如这里的xml,我希望UI在单击cardView时更新txtProvider字段。 我应该如何从viewmodel通知视图的更改 <layout xmlns:bind="http://schemas.android.com/tools"> <data> <variable name="viewmodel" type="io.leapingwolf.myapp
<layout xmlns:bind="http://schemas.android.com/tools">
<data>
<variable name="viewmodel"
type="io.leapingwolf.myapp.viewmodel.MyViewModel"/>
<variable
name="myModel"
type="io.leapingwolf.myapp.models.MyModel"/>
</data>
<android.support.v7.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/cardView"
app:cardCornerRadius="5dp"
app:cardUseCompatPadding="true"
android:onClick="@{viewmodel.onClickModel}">
<TextView
android:id="@+id/txtProvider"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:text="@{myModel.provider}"
android:textColor="@android:color/black"
android:textSize="15sp" />
</android.support.v7.widget.CardView>
</layout>
我的数据类:
data class MyModel(
val type: String?,
var provider: String?
) : AutoParcelable
我将使用java语法,因为我对kotlin不太熟悉: 您需要使用
数据绑定声明您的MyModel
或提供程序
,以启用绑定。在getter上使用@Bindable
,并在setter中调用notifyPropertyChanged
:
@Bindable
public String getProvider() {
return this.provider;
}
public void setProvider(String provider) {
this.lastName = lastName;
notifyPropertyChanged(BR.provider);
}
或者使您的MyModel
扩展BaseObservable
,或者因为您有一个viewmodel,所以创建一个ObservableField
甚至一个ObservableField
:
//在viewmodel中:
私有ObservableField modelField=新ObservableField();
在viewmodel的构造函数中设置值,创建一个getter并在xml
中引用它 这可能更像是科特林的问题。当我将提供程序字符串初始化为ObservableField时
var provider = ObservableField<String>()
init{
provider = route.provider as ObservableField<String>
}
var provider=observeField()
初始化{
provider=路由。provider作为可观察字段
}
我在运行时出错
无法将java.lang.String强制转换为android.databinding.ObservableField
我将尝试将其发布在kotlin讨论网站上,并寻求一些答案。我在kotlin中使用了如下视图模型中的@Bindable。我花了一段时间了解了如何在kotlin语法中使用@Bindable。在我正确使用@Bindable语法之前,无法生成属性BR.provider
fun onClickModel(): View.OnClickListener {
val viewOnClick = View.OnClickListener {
route!!.provider = "name changed"
notifyPropertyChanged(BR.provider)
}
return viewOnClick
}
val provider: String
@Bindable
get() {
Log.d("Utils", "get property")
return route!!.provider!!
}
在MyModel.kt文件中
class MyModel(
@get:Bindable
var provider: String = ""
) : BaseObservable() {
fun updateText(str:String){
provider = str
notifyPropertyChanged(BR.counter)
}
}
然后在layout.xml中
android:onClick="@{() -> myModel.updateText(`YOUR TEXT`)}"
Rebuild
如果无法获取BR,请重新生成项目。计数器
自动完成工作文本字段是什么样子的?布局文件中的txtProvider是文本字段。因此,您的viewmodel中没有文本的变量或属性…?我考虑过它,并对代码进行了一些更改。我在布局文件中为模型创建了一个变量,并将属性绑定到文本字段。然后,我在onClickModel中更改属性值并调用notifyPropertyChanged。但是,对属性值的更改不会传播到UI。任何提示请发布您的代码。我们不是向导,只能猜测出哪里出了问题。我在Kotlin中使用了viewmodel中的@Bindable,比如
class MyModel(
@get:Bindable
var provider: String = ""
) : BaseObservable() {
fun updateText(str:String){
provider = str
notifyPropertyChanged(BR.counter)
}
}
android:onClick="@{() -> myModel.updateText(`YOUR TEXT`)}"