使用@InverseBindingAdapter/AttrChanged进行Android Spinner双向绑定不起作用

我一直试图在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?我究竟做错了什么?

回答:

您在绑定表达式中缺少=以通知系统您希望将此绑定用作双向绑定。

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

应该

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

以上是 使用@InverseBindingAdapter/AttrChanged进行Android Spinner双向绑定不起作用 的全部内容, 来源链接: utcz.com/qa/266557.html

回到顶部