Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 数据绑定和BaseObserver-Android MVVM_Kotlin_Observer Pattern_Android Databinding - Fatal编程技术网

Kotlin 数据绑定和BaseObserver-Android MVVM

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

我有一个textfield,它被数据绑定到一个视图模型,比如这里的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>
我的数据类:

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