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 и удаляю использованного наблюдателя сразу после установки текста.

Другие вопросы по тегам