2016-10-24 11 views
2

私はここでxmlのようなビューモデルにデータバインドされているテキストフィールドを持っており、UIはcardViewのクリック時にtxtProviderフィールドを更新します。 viewmodelからビューへの変更をどのように通知する必要がありますか? (BaseObserverクラスを拡張)MyViewModelでDatabinding and BaseObserver - Android MVVM

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

、私は

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

を得ることができない場合テキストフィールドのように見える? – yennsarah

+0

レイアウトファイルのtxtProviderはテキストフィールドです。 – Akshata

+0

あなたのビューモデルのテキストの変数またはプロパティがありません...? – yennsarah

答えて

1

私はそれじゃないので、私は、Javaの構文を使用しますあなたのMyModelまたはproviderを01で宣言する必要がありますバインドを有効にするにはを入力します。ゲッターの@Bindableを使用し、セッターにnotifyPropertyChangedを呼び出す:

@Bindable 
public String getProvider() { 
    return this.provider; 
} 

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

たりMyModelBaseObservableを延長するか、のviewmodelを持っているので、ObservableField<String>あるいはObservableField<MyModel>作成します

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

セットあなたのビューモデルのコンストラクタの値、getterを作成し、これをxmlで参照してください。

+0

私はそれがビューモデルのように@Bindableを使用してKotlinで働いています – Akshata

0

コットンの問題のほうが多いかもしれません。私は

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

としてObservableFieldとしてプロバイダ文字列を初期化するとき、私はjava.lang.Stringではandroid.databinding.ObservableField

にキャストすることはできませんランタイム でエラーを取得する私はkotlinの議論に掲載しようとしますいくつかの答えを求める。

2

私はKotlinの構文で@Bindableを使用する方法を理解するために、私は下のようなviewmodelで@Bindableを使ってKotlinで作業しました。 @ Bindableの構文を正しく取得するまで、プロパティBR.providerは生成されませんでした。あなたのMyModel.ktファイルで

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

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.counterオートコンプリート作業