Скорее всего вы неправильно поняли механизм работы LiveData. В LiveData из Room всегда будут приходить обновленные данные при их изменении. Стандартный паттерн: в данном случае нужно просто после получения данных из Retrofit вставить их в Room (через функцию insert в Dao с первичным ключом и OnConflictStrategy.Replace чтобы старые данные с одинаковым ключом заменялись на новые) и Room автоматически оповестит слушателей через LiveData об изменениях в данной таблице. Т.е. просто выносите логику осуществления запроса в Retrofit в отдельный метод в ViewModel, например refreshData(). При старте активити сразу вызываете refreshData(), затем подписываетесь на LiveData. В методе onChanged только отправляете адаптеру новые данные и все. Таким образом в onChanged сразу придут кешированные данные из БД (если они там есть), а затем когда Retrofit запрос выполнится и данные вставятся в БД, onChanged будет вызван еще раз и там будут обновленные данные. Заодно можно будет вызывать refreshData() также если пользователь захочет принудительно рефрешнуть данные. В onChanged у вас сейчас говнокод написан, если вы следуете современной архитектуре Android приложений (используя LiveData и ViewModel), запрос там с помощью Retrofit там делается обычно из репозитория, в крайнем случае из ViewModel, но никак не из активити.