数据绑定和BaseObserver – Android MVVM

我有一个数据绑定到一个视图模型的文本框,就像这里的XML一样,我希望UI在点击cardView时更新txtProvider字段。 我应该如何通知我的viewmodel视图的变化?

<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> 

在MyViewModel(它扩展BaseObserver类),我有

 fun onClickModel() : View.OnClickListener { val viewOnClick = View.OnClickListener { v -> myModel!!.provider = "name changed" notifyPropertyChanged(BR.myModel) Toast.makeText(context,"clicked:" + myModel!!.provider , Toast.LENGTH_SHORT).show()} return viewOnClick } 

我的数据类:

 data class MyModel( val type: String?, var provider: String? ) : AutoParcelable 

我使用下面的viewmodel中的@Bindable在Kotlin中工作。花了一段时间了解如何在Kotlin语法中使用@Bindable。 BR.provider属性没有得到生成,直到我有@Bindable语法正确。

 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!! } 

我将使用一个Java语法,因为我不是很流利的kotlin:

你需要用DataBinding声明你的MyModelprovider来启用绑定。 在getter上使用@Bindable ,并在setter中调用notifyPropertyChanged

 @Bindable public String getProvider() { return this.provider; } public void setProvider(String provider) { this.lastName = lastName; notifyPropertyChanged(BR.provider); } 

或者使你的MyModel扩展BaseObservable ,或者你有一个视图模型,创建一个ObservableField<String>或者甚至是一个ObservableField<MyModel>

 //in your viewmodel: private ObservableField<MyModel> modelField = new ObservableField<MyModel>(); 

在viewmodel的构造函数中设置值,创建一个getter并在xml引用它。

这可能是更多的科特林问题。 当我初始化供应商字符串为ObservableField为

 var provider = ObservableField<String>() init{ provider = route.provider as ObservableField<String> } 

在运行时出现错误java.lang.String不能转换为android.databinding.ObservableField

我会尝试发布在kotlin讨论网站上,并寻求一些答案。

在你的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`)}" 

如果您无法获得BR.counter自动完成工作,请Rebuild您的项目