LiveData<String>.getValue () возвращает null, хотя mPendingData содержит правильное значение
Я хочу использовать пользовательский @BindingAdapter, чтобы установить текст TextView, используя LiveData.
TextView:
<TextView
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:gravity="center"
app:keyToText='@{viewmodel.getText("TI_001")}'/>
BindingAdapter:
@BindingAdapter("keyToText")
public static void setTextViewText(TextView tv, LiveData<String> data) {
if (data == null || data.getValue() == null) {
tv.setText(null);
} else {
tv.setText(data.getValue());
}
}
Используя отладчик, я уже проверил, что объект данных содержит правильное значение, которое он делает:
Но, к сожалению, data.getValue() всегда возвращает ноль, поэтому текст не соответствует предоставленному TextView.
Я что-то пропустил? Мне действительно нужно, чтобы это работало... надеюсь.
ОБНОВИТЬ
Для владельца жизненного цикла устанавливается привязка следующим образом:
mBinding.setLifecycleOwner(this);
Когда я использую
viewModel.getText("TI_001").observe(this, new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
tv.setText(s);
}
});
Я могу прочитать значение наблюдаемых LiveData без каких-либо проблем.
ОБНОВЛЕНИЕ 2
Метод getText Viewmodels:
public LiveData<String> getText(String key){
return textRepository.getText(key);
}
Метод getText textRepository:
public LiveData<String> getText(String id){
return textDao.findById(id);
}
И метод findById textDao:
@Query("SELECT text.text FROM text WHERE text.id LIKE :id")
LiveData<String> findById(String id);
1 ответ
Я мог бы найти решение для моей проблемы:
@BindingAdapter("keyToText")
public static void setTextViewText(TextView tv, LiveData<String> data) {
if (data == null) {
tv.setText(null);
} else {
data.observeForever(new Observer<String>() {
@Override
public void onChanged(@Nullable String s) {
tv.setText(data.getValue());
data.removeObserver(this);
}
});
}
}
Поэтому я в основном наблюдаю за своими LiveData только для первого события onChanged и удаляю использованного наблюдателя сразу после установки текста.