具有 2 向绑定(bind)的 Android Spinner 设置选择

标签 android spinner 2-way-object-databinding

当配置了 2 向数据绑定(bind)时,我正在努力获得一些与 Android 微调器一起使用的功能。我想通过 android:selectedItemPosition 上的双向数据绑定(bind)设置微调器的初始值。微调器条目由 ViewModel 初始化并正确填充,因此数据绑定(bind)似乎正常工作。

问题出在 selectedItemPosition 的双向绑定(bind)上。该变量由 ViewModel 初始化为 5,但微调器的选定项保持为 0(第一项)。调试时,ObservableInt 的值似乎最初为 5(已设置),但在 executeBindings 的第二阶段重置为零。

如有任何帮助,我们将不胜感激。

test_spinner_activity.xml

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

    <data>
        <variable name="viewModel"
                  type="com.aapp.viewmodel.TestSpinnerViewModel"/>
    </data>
    <LinearLayout android:layout_width="match_parent"
                  android:layout_height="wrap_content">
       <android.support.v7.widget.AppCompatSpinner
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:id="@+id/sTimeHourSpinner"
            android:selectedItemPosition="@={viewModel.startHourIdx}"
            android:entries="@{viewModel.startTimeHourSelections}"/>
    </LinearLayout>
</layout>

TestSpinnerViewModel.java

public class TestSpinnerViewModel {
    public final ObservableArrayList<String> startTimeHourSelections = new ObservableArrayList<>();
    public final ObservableInt startHourIdx = new ObservableInt();

    public TestSpinnerViewModel(Context context) {
        this.mContext = context;

        for (int i=0; i < 24; i++) {
            int hour = i;
            startTimeHourSelections.add(df.format(hour));
        }
        startHourIdx.set(5);
    }
}

TestSpinnerActivity.java

public class TestSpinnerActivity extends AppCompatActivity {
    private TestSpinnerActivityBinding binding;
    private TestSpinnerViewModel mTestSpinnerViewModel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = DataBindingUtil.bind(findViewById(R.id.test_spinner));
        mTestSpinnerViewModel = new TestSpinnerViewModel(this);
        binding.setViewModel(mTestSpinnerViewModel);
    }

我正在使用 Android Studio 2.2.2 并且启用了数据绑定(bind)。

最佳答案

感谢您的建议。但我找到了我自己问题的答案。事实证明,android:selectedItemPosition=@={viewModel.startHourIdx} 变量从初始值 5 重置为 0 的原因是 selectedItemPosition 的声明顺序entries 属性。在我的示例中,它们是按特定顺序声明的,自动生成的绑定(bind)代码以相同顺序生成初始化。

因此,即使 selectedItemPosition 设置正确,entries 的初始化也会导致 ArrayAdapter 的实例化,它将 selectedItemPosition 重置为 0 .

因此,解决方法是交换布局文件中的两个属性声明。

<data>
    <variable name="viewModel"
              type="com.aapp.viewmodel.TestSpinnerViewModel"/>
</data>
<LinearLayout android:layout_width="match_parent"
              android:layout_height="wrap_content">
   <android.support.v7.widget.AppCompatSpinner
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:id="@+id/sTimeHourSpinner"
        android:entries="@{viewModel.startTimeHourSelections}"
        android:selectedItemPosition="@={viewModel.startHourIdx}"/>
</LinearLayout>

关于具有 2 向绑定(bind)的 Android Spinner 设置选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575112/

相关文章:

android - 无法从 CursorAdapter 内部的一行中删除 EditText

android - 如何在 Android 数据绑定(bind)中的属性更改时得到通知?

javascript - 获取双向数据绑定(bind)的数据

android - 有没有办法在图层列表定义中对我的应用程序项目进行动画(旋转)?

java - 在 HTC 设备上深度测试绘图问题

android - 如何使 android WebView 加载速度更快?

java - 如何在 Android 中使用 Java 从服务数据中提取的字符串中删除双引号?

android - 为什么我的 ProgressBar 在不同的布局中看起来不同

Android:从按钮打开微调器

javascript - 通过 2 路绑定(bind)在嵌套模板之间切换 polymer