如何刷新架构组件 ViewModel 中的数据

8

I'm having the following 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;
}

我会这样观察Fragment中的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;
        }
    });
}

问题是:如何正确刷新“feed”?假设用户触发了swipeToRefresh,那么该事件必须创建一个“feed”的刷新任务。我该如何实现这个功能呢?

1
如果你有答案,能否提供一下呢? - Soon Santos
2个回答

2

您需要获取数据并使用liveData.post(new data)更新实时数据。

In your Activity: 
//to be called on refresh data 
viewModel.getLatestFeed()

In your View Model:
fun getLatestFeed() {
//get data from repository
feed.post(refreshedData)
}

2
你可以使用“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逻辑
我测试过了,它很有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接