我正在研究房间实时数据数据绑定概念。我正在使用自定义绑定适配器将列表设置为微调器。但是我在第一次从房间检索时得到空实时数据。
法典:
@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);
}
}
});
检查以下两件事:
- 更改
.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);
}
- 不要延迟加载
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;