2016-10-17 151 views
1

我一直試圖在Spinner上設置一個雙向綁定。使用@InverseBindingAdapter/AttrChanged進行Android Spinner雙向綁定不起作用

有很多這樣的例子,在網絡上和堆棧溢出,但沒有一個適合我。

這只是一個國家的微調,我已經爲它定義一個國家適配器此方法:

@InverseBindingAdapter(attribute = "selectedCountry", event = "selectedCountryAttrChanged") 
public static String bindCountryInverseAdapter(AppCompatSpinner pAppCompatSpinner) { 
    Object selectedItem = pAppCompatSpinner.getSelectedItem(); 
    SpinnerAdapter adapter = pAppCompatSpinner.getAdapter(); 
    if (adapter instanceof CountrySpinnerAdapter) { 
     return (String) selectedItem; 
    } 
    throw new UnsupportedOperationException("The adapter must be a CountrySpinnerAdapter"); 
} 

@BindingAdapter(value = "selectedCountryAttrChanged", requireAll = false) 
public static void bindCountryChanged(AppCompatSpinner pAppCompatSpinner, final InverseBindingListener newTextAttrChanged) { 
    AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      newTextAttrChanged.onChange(); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      newTextAttrChanged.onChange(); 
     } 
    }; 
    pAppCompatSpinner.setOnItemSelectedListener(listener); 

} 

@BindingAdapter("selectedCountry") 
public static void bindCountryValue(AppCompatSpinner pAppCompatSpinner, String newSelectedValue) { 
    SpinnerAdapter adapter = pAppCompatSpinner.getAdapter(); 
    if (adapter instanceof CountrySpinnerAdapter) { 
     ((CountrySpinnerAdapter) adapter).bindSelectedValue(pAppCompatSpinner, newSelectedValue); 
     return; 
    } 
    throw new UnsupportedOperationException("The adapter must be a CountrySpinnerAdapter"); 
} 

bindCountryChanged方法不會被調用。

我也試過這個變體(以下其他例子):

@BindingAdapter(value = {"selectedCountry", "selectedCountryAttrChanged"}, requireAll = false) 
public static void bindCountryValueChanged(AppCompatSpinner pAppCompatSpinner, String newSelectedValue, final InverseBindingListener newTextAttrChanged) { 
    AdapterView.OnItemSelectedListener listener = new AdapterView.OnItemSelectedListener() { 
     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      newTextAttrChanged.onChange(); 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      newTextAttrChanged.onChange(); 
     } 
    }; 
    pAppCompatSpinner.setOnItemSelectedListener(listener); 

} 

這就是所謂的,但newTextAttrChanged總是空。

佈局,結合部分:

<data> 
    <variable 
     name="customer" 
     type="my.package.CustomerBinding" /> 
</data> 

而且小部件:

<android.support.v7.widget.AppCompatSpinner 
    android:id="@+id/editCountry" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:spinnerMode="dropdown" 
    app:adapter="@{customer.countrySpinnerAdapter}" 
    app:selectedCountry="@{customer.country}" /> 

country ID只是一個ObservableField<String>countrySpinnerAdapter是國家的列表中BaseAdapter

的Android gradle這個插件:

classpath 'com.android.tools.build:gradle:2.2.1' 

工具版本:

buildToolsVersion "24.0.2" 

當然,數據綁定啓用:

dataBinding { 
    enabled = true 
} 

爲什麼newTextAttrChanged總是空/對BindingAdapter從來都不是calld?我究竟做錯了什麼?

+0

'應用:= SELECTEDCOUNTRY 「@ {} customer.country」'你不缺少'='的雙向綁定,所以它應該是'應用:= SELECTEDCOUNTRY 「@ = {} customer.country」'...? – yennsarah

+0

耶穌你是對的!我總是忽視它...你能告訴我'@ = {'和'@ {'?我一直使用後者,當我應該使用'='形式? –

+0

我會發佈一個答案。 ;) – yennsarah

回答

5

您在綁定表達式中缺少=以通知系統您希望將此綁定用作雙向綁定。

app:selectedCountry="@{customer.country}" 

應該

app:selectedCountry="@={customer.country}" 
+0

我根本沒有提出你的答案..這確實是正確的,但我真的很想明白:[官方文檔] [1]沒有提到這件事。也沒有[其他] [2]關於雙向數據綁定的文章。這是需要一個常規的ObservableField嗎?這是我第一次嘗試雙向數據綁定,並且讓我困惑:)可能以自定義字段開頭並不是最明智的決定,要麼是 [1] https://developer.android.com/topic/libraries/data -binding/index.html [2] https://medium.com/@fabioCollini/android-data-binding-f9f9d3afc761#.xmm1v68hu –

+0

[This](https:// medium。com/google-developers/android-data-binding-2-way-your-way-ccac20f6313#.ijqh87173)是來自DataBinding庫開發人員George Mount的文章。你也應該看看他的其他文章介質:) – yennsarah

+0

我會這樣做,謝謝...我希望這種事情是寫在官方文件艱難... ... –

相關問題