2016-09-21 65 views
2

我有一個父類,我們可以稱它爲BaseViewModel,這個類可以被鍵入並且具有相同類型的ObservableField。像這樣:使用ObservableField <>進行雙向數據綁定,set()不起作用?

public class BaseViewModel<T> extends BaseObservable { 

    ObservableField<T> value = new ObservableField<>(); 

    public T getValue() { 
     return value.get(); 
    } 

    public void setValue(T value) { 
     this.value.set(value); 
     setHasChanges(value != originalValue); 
    } 

} 

我爲這門課得到了許多孩子。其中之一是StringViewModel,就像它的名字說的那樣,它給出了一個字符串值。這個子類覆蓋的setValue()方法:

public class StringViewModel extends BaseViewModel<String> { 

    @Override 
    public void setValue(String value) { 
     this.value.set(value); 
     if(value != null && !value.isEmpty()){ 
      setHasChanges(!value.equals(originalValue)); 
     } 
     else if(originalValue == null) 
      setHasChanges(false); 
     else 
      setHasChanges(!originalValue.isEmpty()); 
    } 

    //Other methods ... 

} 

而且我得到了使用StringViewModel佈局:

<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools"> 

    <data> 

     <variable 
      name="viewModel" 
      type="com.myproject.viewmodels.StringViewModel" /> 

    </data> 

    <EditText 
     android:id="@+id/value" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 

     android:clickable="@{viewModel.editable}" 
     android:cursorVisible="@{viewModel.editable}" 

     android:ellipsize="end" 
     android:focusable="@{viewModel.editable}" 
     android:focusableInTouchMode="@{viewModel.editable}" 
     android:inputType="textMultiLine|textNoSuggestions" 

     android:text="@={viewModel.value}" 
     app:setError="@{viewModel.error}" 

     tools:text="Dupont" /> 

    <!-- Other layouts ... --> 

但是,當我打電話的setValue ()我的方法StringViewModel,該值設置爲ViewModel,但不在EditText上。

編輯:我還要說,我已經加我StringViewModel數據綁定正確(使用DataBindingUtil誇大我的數據綁定)。

myDataBinding.setViewModel(new StringViewModel());

是否有人得到了一個解釋這種現象?


編輯

正如@iMDroid說,我應該有通話notifyChange()在我的方法setValue()。我買ObservableFields是爲我做的,我的壞。

回答

2

我不是雙向數據綁定的專家..但我一直在閱讀關於它的文章,所以這裏有一個解決方案可以幫助你。

假設你的模型類是這樣的:

public class Echo { 
    public String text; 
} 

而且你的佈局文件是R.layout.echo

他們說,你應該使用 DataBindingUtil類設置佈局,然後對象在其上進行EchoBinding綁定(根據佈局自動生成 ),如下所示:

EchoBinding binding = DataBindingUtil.setContentView(
     this, R.layout.echo); 
    binding.setEcho(new Echo()); 

另外,您可以使用app:binding="@{echo.text}"屬性將值綁定到EditText。

<EditText 
    android:layout_width=」match_parent」 
    android:layout_height=」wrap_content」 
    android:hint="Text 1" 
    app:binding="@{echo.text}"/> 

而且最後加入notifyChange()setValue()方法。

有關更多信息,請參閱此link

你可以試一試..希望它有幫助。

+0

感謝您的幫助,但是當我編輯我的問題時,我忘了提及這一點。我實際上已經正確使用DataBindingUtil將我的變量添加到DataBinding中。 – MHogge

+0

即使我編輯了我的答案..你嘗試添加notifyChange()嗎? – iMDroid

+1

不錯,它的工作!我以爲是因爲它是ObservableField,我不需要通知任何東西,我的壞。感謝您的幫助,我會接受這個答案。 – MHogge

0

將StringViewModel添加到佈局是不夠的。在onCreate()或onCreateView()中,取決於您使用的是哪個(Activity或Fragment),您必須告訴dataBinding使用已定義的StringViewModel類。

中的onCreate(),你想要做的事就像

dataBinding.viewModel =新StringViewModel();

現在,dataBinding知道你的意思,他們現在連接。

我相信你已經設置了dataBinding。

+0

是的我將StringViewModel設置爲我的DataBinding。對不起,我會更新我的問題以添加此信息。 – MHogge

相關問題