У меня следующая ViewModel:
public class FeedViewModel extends ViewModel {
private final FeedRepository repository;
private LiveData<Resource<List<Photo>>> feed;
@Inject
FeedViewModel(@NonNull final FeedRepository repository) {
this.repository = repository;
}
LiveData<Resource<List<Photo>>> getUserFeed() {
if (feed == null) {
feed = new MutableLiveData<>();
feed = repository.get();
}
return feed;
}
}
Я наблюдаю кормить во фрагменте так:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
viewModel.getUserFeed().observe(this, feed -> {
switch (feed.status) {
case ERROR:
processErrorState(feed.data);
break;
case LOADING:
processLoadingState(feed.data);
break;
case SUCCESS:
if (feed.data != null)
processSuccessState(feed.data);
break;
}
});
}
Возникает вопрос: как правильно обновить кормить? Предположим, что пользователь запустил swipeToRefresh, поэтому это событие должно создать задачу обновления ленты. Как я могу это реализовать?
Вам нужно будет получить данные и обновить данные в реальном времени с помощью liveData.post (новые данные)
In your Activity:
//to be called on refresh data
viewModel.getLatestFeed()
In your View Model:
fun getLatestFeed() {
//get data from repository
feed.post(refreshedData)
}
Вы можете использовать loadTrigger для запуска загрузки данных при пролистывании для обновления.
Добавьте этот код в свой фрагмент:
viewModel.userFeeds.observe(
//add observation code
)
swipToRefresh.setOnRefreshListener {
viewModel.loadFeeds()
}
и в viewModel:
val loadTrigger = MutableLiveData(Unit)
val userFeeds = loadTrigger.switchMap {
repository.get()
}
fun loadFeeds() {
loadTrigger.value = Unit
//livedata gets fired even though the value is not changed
}
Решение предлагается здесь: ручное обновление без изменения существующих LiveData
Я протестировал его, и он работает хорошо.
Можете ли вы дать ответ, если он у вас есть?