使用 XML 的 Android 微调器数据绑定并显示所选值

新手上路,请多包涵

我正在使用新的 android 数据绑定,它工作得很好。我能够使用 EditText、TextView、Radio 和复选框执行数据绑定。现在,我无法在微调器中进行数据绑定。

在下面的链接中找到了一些线索: Android Spinner data binding with xml layout

但是,仍然无法找到解决方案。还需要执行双向数据绑定。应反映微调器数据的选定值。

有人可以给我举个例子吗?

这是我的 xml 代码:

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

    <data>
        <import type="android.view.View" />
        <variable
            name="viewModel"
            type="com.ViewModels.model" />
    </data>

     <Spinner
                    android:id="@+id/assessmemt_spinner"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_margin="@dimen/carview_margin"
                    android:layout_toRightOf="@+id/text_bp"
                    android:drawSelectorOnTop="true"
                    android:spinnerMode="dropdown"
                   android:visibility="@{viewModel.type.equals(@string/spinner_type)?  View.VISIBLE : View.GONE}" />
</layout>

查看模型:

  public class AssessmentGetViewModel {
    private String valueWidth;
    private ArrayList<String> values;
    private String type;
    public String getValueWidth() { return this.valueWidth; }
    public void setValueWidth(String valueWidth) { this.valueWidth = valueWidth; }
    public ArrayList<String> getvalues() { return this.values; }
    public void setvalues(ArrayList<String> values) { this.values = values; }
    public String gettype() { return this.type; }
    public void settype(String type) { this.type = type; }
    }

原文由 San Jaisy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 791
1 个回答

1 线解决方案

android:selectedItemPosition="@={item.selectedItemPosition}"

而已! 无需制作自定义 BindingAdapter。

Spinner 已经支持通过属性 selectionselectedItemPosition 进行双向绑定。请参阅 Android 文档

您只需要使用两种方式绑定 selectedItemPosition 以便微调器上的更改反映在您的模型字段上。

例子

项目.class

 public class Item extends BaseObservable {
    private int selectedItemPosition;

    @Bindable
    public int getSelectedItemPosition() {
        return selectedItemPosition;
    }

    public void setSelectedItemPosition(int selectedItemPosition) {
        this.selectedItemPosition = selectedItemPosition;
        notifyPropertyChanged(BR.selectedItemPosition);
    }
}

activity_main.xml

 <variable
    name="item"
    type="com.sample.data.Item"/>

<android.support.v7.widget.AppCompatSpinner
    ...
    android:entries="@array/items"
    android:selectedItemPosition="@={item.selectedItemPosition}"
    >

主活动.java

 public class MainActivity extends AppCompatActivity {
    ActivityMainBinding binding;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        binding.setItem(new Item());
        binding.getItem().setSelectedItemPosition(4); // this will change spinner selection.
        System.out.println(getResources().getStringArray(R.array.items)[binding.getItem().getSelectedItemPosition()]);
    }
}

如果您需要随时从代码中获取所选项目,请使用此

binding.getItem().getSelectedItemPosition(); // get selected position
getResources().getStringArray(R.array.items)[binding.getItem().getSelectedItemPosition()]) // get selected item

如果您需要以编程方式更改它,请将您的变量设置为 @Bindable

 binding.getItem().setSelectedItemPosition(4);

否则,您可以删除 @BindablenotifyPropertyChanged(BR.selectedItemPosition);

您可以使用任何 BaseObservableObservableFieldLive Data 。它是由你决定。 我使用 BaseObservable 因为它非常简单。 ,只是从 BaseObservable 扩展,现在所有字段都是可观察的。

原文由 Khemraj Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题