微调器条目绑定适配器房间实时数据不起作用



我正在研究房间实时数据数据绑定概念。我正在使用自定义绑定适配器将列表设置为微调器。但是我在第一次从房间检索时得到空实时数据。

法典:

     @Query("select * from Student")
        LiveData<List<Student>> getAllItems();

        @BindingAdapter({"bind:entries"})
            public static void customSpinnerBinding(AppCompatSpinner appCompatSpinner,LiveData<List<Student>> listLiveData){
                if(listLiveData != null && listLiveData.getValue().size() > 0){
                    ArrayAdapter<Student> spinnerArrayAdapter = new ArrayAdapter<Student>
                            (appCompatSpinner.getContext(), android.R.layout.simple_spinner_item,
                                    listLiveData.getValue()); //selected item will look like a spinner set from XML
                    spinnerArrayAdapter.setDropDownViewResource(android.R.layout
                            .simple_spinner_dropdown_item);
                    appCompatSpinner.setAdapter(spinnerArrayAdapter);
                }
            }
        public LiveData<List<Student>> getListLiveData() {
            if(listLiveData == null){
               listLiveData = studentDB.studentDao().getAllItems();
            }
            return listLiveData;
        }
        <android.support.v7.widget.AppCompatSpinner
                    android:id="@+id/spinner"
                    android:layout_width="0dp"
                    bind:entries="@{viewmodel.listLiveData}"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="16dp"
                    android:layout_marginLeft="16dp"
                    android:layout_marginTop="16dp"
                    android:layout_marginEnd="16dp"
                    android:layout_marginRight="16dp"
                    android:layout_marginBottom="16dp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />
but if i observe livedata in activity this is working
  mainViewModel.getListLiveData().observe(this, new Observer<List<Student>>() {
           @Override
           public void onChanged(@Nullable List<Student> students) {
               if(students.size() > 0){
                   ArrayAdapter<Student> spinnerArrayAdapter = new ArrayAdapter<Student>
                    (MainActivity.this, android.R.layout.simple_spinner_item,
                            students); //selected item will look like a spinner set from XML
            spinnerArrayAdapter.setDropDownViewResource(android.R.layout
                    .simple_spinner_dropdown_item);
            activityMainBinding.appbar.contentid.spinner.setAdapter(spinnerArrayAdapter);
               }
           }
       });

检查以下两件事:

  1. 更改.customSpinnerBinding以接受List<Student>而不是LiveData<List<Student>>

BindingAdapter接受的是LiveData内部的东西,而不是LiveData本身。 LiveData不是改变的那个。只有LiveData通知的内容会更改。

示例绑定适配器:

        @BindingAdapter({"bind:entries"})
        public static void customSpinnerBinding(AppCompatSpinner appCompatSpinner, List<Student> students) {
            ArrayAdapter<Student> spinnerArrayAdapter = new ArrayAdapter<Student>
                    (appCompatSpinner.getContext(), android.R.layout.simple_spinner_item,
                         students); //selected item will look like a spinner set from XML
            spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            appCompatSpinner.setAdapter(spinnerArrayAdapter);
        }


  1. 不要延迟加载listLiveData

看起来您的视图无论如何都需要它,懒惰加载它有什么意义?它只会通过使视图模型更具状态性来使代码更复杂且更难调试。只需急切地加载学生名单,并将其宣布为最终名单,以使其变得更好。

public final LiveData listLiveData = studentDB.studentDao().getAllItems();

如果必须延迟加载listLiveData请确保它已初始化。在您的.xml中:

    <android.support.v7.widget.AppCompatSpinner
                ...
                bind:entries="@{viewmodel.getListLiveData()}"
                ... />
<</div> div class="one_answers">

尝试

listLiveData = StudentDB.getAppDatabase(application).studentDao().getAllItems();
return listLiveData;

最新更新