LiveData - наблюдать объекты в списке - PullRequest
0 голосов
/ 28 августа 2018

У меня есть список Functions, который извлекается из локальной базы данных SQLite с использованием Room, и я хочу наблюдать за каждой функцией в этом списке. На данный момент я делаю следующее:

public List<MutableLiveData<Function>> getLiveFunctions() {
    if (liveFunctions == null) {
        liveFunctions = new ArrayList<>();
        for (Function function : functions) {
            //Livedata with a default value on background thread (postValue)
            liveFunctions.add(new DefaultLiveData<>(function, true));
        }
    }
    return liveFunctions;
}

После локальной выборки из базы данных я могу запросить состояние данной функции с помощью RPC на моем сервере. Когда я получаю ответ, я могу установить новое значение для этой функции, и я хочу, чтобы мой пользовательский интерфейс наблюдал за изменениями в этой функции.

Просто некоторые уточнения:

  1. Разница между LiveData<List<Function>>> и List<LiveData<Function>> заключается в том, что первый будет только наблюдать, был ли объект добавлен, обновлен или удален в списке, правильно? Разве не LiveData<List<Function>>> тоже слушает изменения своих предметов?

  2. Я использую MediatorLiveData для объединения моих наблюдателей с «FunctionObserver». Это правильный подход для обработки всех моих функций обратного вызова?

[код]

MediatorLiveData<LiveData<Function>> mediator = new MediatorLiveData<>();
List<MutableLiveData<Function>> functions = //functions
for (LiveData<Function> function : functions) {
    mediator.addSource(function, functionObserver);
}

mediator.observe(MainActivity.this, new Observer<LiveData<Function>>() {
    @Override
    public void onChanged(@Nullable LiveData<Function> functionLiveData) {
        Log.i(TAG, "Live data change: ");
    }
});
  1. Можно ли улучшить мою логику кода? Я знаю, что могу запросить LiveData<List<Function>>> из комнаты, но у меня возникли проблемы с моим родительским классом, имеющим аннотацию @Relation, для которой тип должен быть List или Set (а не LiveData)
...