Android数据绑定-找不到属性的getter

Android数据绑定-找不到属性的getter,android,android-layout,android-databinding,Android,Android Layout,Android Databinding,我看进去后用了一些旋转装订。但是在那之后我就不能编译代码了 错误 发现数据绑定错误。 ****/数据绑定错误****msg:在android.widget.Spinner上找不到值类型为java.lang.String的属性“selectedValue”的getter。 文件:D:\Khemraj\u AndroidStudioWorkspace\u\amelioFinal\app\src\main\res\layout\activity\u cart.xml 地点:167:24-175:33

我看进去后用了一些旋转装订。但是在那之后我就不能编译代码了

错误

发现数据绑定错误。 ****/数据绑定错误****msg:在android.widget.Spinner上找不到值类型为java.lang.String的属性“selectedValue”的getter。 文件:D:\Khemraj\u AndroidStudioWorkspace\u\amelioFinal\app\src\main\res\layout\activity\u cart.xml 地点:167:24-175:33 ****\数据绑定错误****

波乔

在xml中

  <variable
        name="viewModel"
        type="com.amelio.model.ViewModel"/>


bindingUtil

public class SpinnerBindingUtil {

    @BindingAdapter(value = {"selectedValue", "selectedValueAttrChanged"}, requireAll = false)
    public static void bindSpinnerData(AppCompatSpinner pAppCompatSpinner, String newSelectedValue, final InverseBindingListener newTextAttrChanged) {
        pAppCompatSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                newTextAttrChanged.onChange();
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        if (newSelectedValue != null) {
            int pos = ((ArrayAdapter<String>) pAppCompatSpinner.getAdapter()).getPosition(newSelectedValue);
            pAppCompatSpinner.setSelection(pos, true);
        }
    }
    @InverseBindingAdapter(attribute = "selectedValue", event = "selectedValueAttrChanged")
    public static String captureSelectedValue(AppCompatSpinner pAppCompatSpinner) {
        return (String) pAppCompatSpinner.getSelectedItem();
    }

}
公共类SpinnerBindingUtil{
@BindingAdapter(值={“selectedValue”,“selectedValueAttrChanged”},requireAll=false)
公共静态void bindSpinnerData(AppCompatSpinner pAppCompatSpinner、字符串newSelectedValue、最终反转BindingListener newTextAttrChanged){
pAppCompatSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener()文件){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
newTextAttrChanged.onChange();
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
if(newSelectedValue!=null){
int pos=((ArrayAdapter)pAppCompatSpinner.getAdapter()).getPosition(newSelectedValue);
pAppCompatSpinner.setSelection(位置,正确);
}
}
@InverseBindingAdapter(attribute=“selectedValue”,event=“selectedValueAttrChanged”)
公共静态字符串captureSelectedValue(AppCompatSpinner pAppCompatSpinner){
返回(字符串)pAppCompatSpinner.getSelectedItem();
}
}

有一个android:selectedItemPosition属性,支持开箱即用的双向数据绑定。您可以使用它或使用它的
BindingAdapter
/
InverseBindingAdapter
对作为模板:

@InverseBindingMethods({
    @InverseBindingMethod(type = AdapterView.class, attribute = "android:selectedItemPosition"),
    @InverseBindingMethod(type = AdapterView.class, attribute = "android:selection",
            method = "getSelectedItemPosition",
            event = "android:selectedItemPositionAttrChanged"),
})

这会让我做这样的事情:

@InverseBindingMethods({
    @InverseBindingMethod(type = AdapterView.class,
                          attribute = "android:selectedValue",
                          method = "getSelectedItem"
})
public class SelectedValueBindingAdapter {
    @BindingAdapter("android:selectedValueAttrChanged")
    public static void setSelectedValueListener(AdapterView view,
            final InverseBindingListener attrChanged) {
        if (attrChanged == null) {
            view.setOnItemSelectedListener(null);
        } else {
            view.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    attrChanged.onChange();
                }
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    attrChanged.onChange();
                }
            });
        }
    }

    @BindingAdapter("android:selectedValue")
    public static void setSelectedValue(AdapterView<?> view, Object selectedValue) {
        Adapter adapter = view.getAdapter();
        if (adapter == null) {
            return;
        }
        // I haven't tried this, but maybe setting invalid position will
        // clear the selection?
        int position = AdapterView.INVALID_POSITION;

        for (int i = 0; i < adapter.getCount(); i++) {
            if (adapter.getItem(i) == selectedValue) {
                position = i;
                break;
            }
        }
        view.setSelection(position);
    }
}
@InverseBindingMethods({
@InverseBindingMethod(类型=AdapterView.class,
attribute=“android:selectedValue”,
方法=“getSelectedItem”
})
公共类SelectedValueBindingAdapter{
@BindingAdapter(“android:selectedValueAttrChanged”)
公共静态无效设置SelectedValueListener(AdapterView视图,
最终反演发现(已更改){
if(attrChanged==null){
view.setOnItemSelectedListener(空);
}否则{
view.setOnItemSelectedListener(新的OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
attrChanged.onChange();
}
@凌驾
未选择公共无效(AdapterView父级){
attrChanged.onChange();
}
});
}
}
@BindingAdapter(“android:selectedValue”)
公共静态无效设置selectedValue(AdapterView视图,对象selectedValue){
Adapter=view.getAdapter();
if(适配器==null){
返回;
}
//我还没有尝试过这个,但是设置无效的位置可能会
//清除所选内容?
int位置=AdapterView.INVALID_位置;
对于(inti=0;i
我认为
ViewModel
类应该为属性设置getter和setter,即
setSelectedValue()
getSelectedValue()
我不这么认为,它是一个属性而不是model类的变量。我得到的答案是14票,奇怪。
@InverseBindingMethods({
    @InverseBindingMethod(type = AdapterView.class, attribute = "android:selectedItemPosition"),
    @InverseBindingMethod(type = AdapterView.class, attribute = "android:selection",
            method = "getSelectedItemPosition",
            event = "android:selectedItemPositionAttrChanged"),
})
@BindingAdapter("android:selectedItemPosition")
public static void setSelectedItemPosition(AdapterView view, int position) {
    if (view.getSelectedItemPosition() != position) {
        view.setSelection(position);
    }
}

@BindingAdapter(value = {"android:onItemSelected", "android:onNothingSelected",
        "android:selectedItemPositionAttrChanged" }, requireAll = false)
public static void setOnItemSelectedListener(AdapterView view, final OnItemSelected selected,
        final OnNothingSelected nothingSelected, final InverseBindingListener attrChanged) {
    if (selected == null && nothingSelected == null && attrChanged == null) {
        view.setOnItemSelectedListener(null);
    } else {
        view.setOnItemSelectedListener(
                new OnItemSelectedComponentListener(selected, nothingSelected, attrChanged));
    }
}
@InverseBindingMethods({
    @InverseBindingMethod(type = AdapterView.class,
                          attribute = "android:selectedValue",
                          method = "getSelectedItem"
})
public class SelectedValueBindingAdapter {
    @BindingAdapter("android:selectedValueAttrChanged")
    public static void setSelectedValueListener(AdapterView view,
            final InverseBindingListener attrChanged) {
        if (attrChanged == null) {
            view.setOnItemSelectedListener(null);
        } else {
            view.setOnItemSelectedListener(new OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                    attrChanged.onChange();
                }
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                    attrChanged.onChange();
                }
            });
        }
    }

    @BindingAdapter("android:selectedValue")
    public static void setSelectedValue(AdapterView<?> view, Object selectedValue) {
        Adapter adapter = view.getAdapter();
        if (adapter == null) {
            return;
        }
        // I haven't tried this, but maybe setting invalid position will
        // clear the selection?
        int position = AdapterView.INVALID_POSITION;

        for (int i = 0; i < adapter.getCount(); i++) {
            if (adapter.getItem(i) == selectedValue) {
                position = i;
                break;
            }
        }
        view.setSelection(position);
    }
}