2017-10-29 12 views
-1

TextViewをJodaTimeの日付にバインドしたいので、日付の値がプログラムによって変更されるとTextViewが変更されます。私はそれを初めて表示することに成功しましたが、日付が変更された場合、ビューは更新されません。bind TextView to Date

のTextView:

<TextView 
      android:id="@+id/day" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@{mainViewModel.day}" /> 

のViewModel:

public class RoomListViewModel extends Observable{ 
    private LocalDate day; 


public String getDay(){ 
     return day.toString("dd/MM/yyyy"); 
    } 

    public void previousDay() { 
     day = day.plusDays(1); 
     setChanged(); 
     notifyObservers(); 
    } 

    public void nextDay() { 
     day = day.minusDays(1); 
     setChanged(); 
     notifyObservers(); 
    } 

私は何をしないのですか?

答えて

2

あなたの変数の命名は、実際にあなたを混乱させる。

TextViewStringタイプで動作するため、getDay()というメソッドが呼び出されます。この場合、ObservableField<LocalDate> dayは(レイアウトから)呼び出されません。

レイアウトを動的に変更できるようにするには、@Bindanbleアノテーションを使用する必要があります。

例:

private LocalDate mDay; 

@Bindable 
public String getDay(){ 
    return mDay.toString("dd/MM/yyyy"); 
} 

public void previousDay() { 
    mDay = mDay.plusDays(1); 
    notifyPropertyChanged(BR.day); // you will have to import this (something like com.yourproject.BR) 
} 

public void nextDay() { 
    mDay = mDay.minusDays(1); 
    notifyPropertyChanged(BR.day); 
} 

あなたのViewModelはBaseObservable(可能な場合)またはObservableインタフェースを実装する(あなただけBaseObservable実装をコピーすることができます)を継承する必要があります。

[それを作成していない、単純な構文エラーが含まれていてもよい]

+0

私のViewModelはすでにjava.util.Observableを拡張し、私は私の設定でそれを行う方法を見ることができません。私はdatabinding.Observableを実装する場合、私はaddOnPropertyChangedCallbackを使用してプロパティの変更を聞く必要があると思いますが、それを行う方法は? –

+1

さて、アンドロイドデータバインディングは 'java.util.Observable'では動作しません。これは 'android.databinding.Observable'で動作します。これを拡張する代わりに、既に実装が必要な 'BaseObservable'から拡張してください。それでは 'notifyPropertyChanged(BR.day);を呼び出してください。 – mlyko

+0

はい、残念ながらこのアプリはそのように構築されています。私はこの特定のケースのための迅速な修正が必要でした。とにかく、有益な情報ありがとう: –