【问题标题】:How to refresh data in Architecture Components ViewModel如何在架构组件 ViewModel 中刷新数据
【发布时间】:2024-04-12 12:40:02
【问题描述】:

我有以下 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 的刷新任务。我该如何实现?

【问题讨论】:

  • 如果你有答案,可以提供答案吗?

标签: android mvvm refresh viewmodel android-architecture-components


【解决方案1】:

您必须使用 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
    }
    

    这里建议解决方案: manual refresh without modifying your existing LiveData

    我测试过,效果很好。

    【讨论】: