LiveData <String>.getValue () возвращает ноль, хотя mPendingData содержит правильное значение - PullRequest
0 голосов
/ 18 января 2019

Я хочу использовать пользовательский @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());
    }
}

Используя отладчик, я уже проверил, что объект данных содержит правильное значение, что он делает:

enter image description here

Но, к сожалению, data.getValue () всегда возвращает значение NULL, поэтому текст не соответствует предоставленному TextView.

Я что-то упустил? Мне действительно нужно, чтобы это работало так ... надеюсь.

UPDATE

Для владельца жизненного цикла устанавливается привязка следующим образом:

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 текстового репозитория:

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 Ответ

0 голосов
/ 20 января 2019

Я мог бы найти решение для моей проблемы:

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

...