我正在尝试使用架构组件实现一个简单的应用程序。我可以使用 Retrofit2 从 RestApi 服务获取信息。我可以在相应的回收器视图中显示信息,当我旋转手机时,一切正常。现在我想按一种新的对象(按字符串(过滤
有人可以用 ViewModel 指导我一点吗,我不知道这样做的最佳实践是什么......我正在使用 MVVM...
这是我的观点模型:
public class ListItemViewModel extends ViewModel {
private MediatorLiveData<ItemList> mList;
private MeliRepository meliRepository;
/* Empty Contructor.
* To have a ViewModel class with non-empty constructor,
* I have to create a Factory class which would create instance of you ViewModel and
* that Factory class has to implement ViewModelProvider.Factory interface.
*/
public ListItemViewModel(){
meliRepository = new MeliRepository();
}
public LiveData<ItemList> getItemList(String query){
if(mList == null){
mList = new MediatorLiveData<>();
LoadItems(query);
}
}
private void LoadItems(String query){
String queryToSearch = TextUtils.isEmpty(query) ? "IPOD" : query;
mList.addSource(
meliRepository.getItemsByQuery(queryToSearch),
list -> mList.setValue(list)
);
}
}
更新
我使用转换生命周期库中的包来解决此问题...在此处输入链接说明
public class ListItemViewModel extends ViewModel {
private final MutableLiveData<String> mQuery = new MutableLiveData<>();
private MeliRepository meliRepository;
private LiveData<ItemList> mList = Transformations.switchMap(mQuery, text -> {
return meliRepository.getItemsByQuery(text);
});
public ListItemViewModel(MeliRepository repository){
meliRepository = repository;
}
public LiveData<ItemList> getItemList(String query){
return mList;
}
}
@John这是我的解决方案。我正在使用生命周期库,解决方案比我想象的要容易。感谢!
我更熟悉在 Kotlin 中执行此操作,但您应该能够轻松地将其转换为 Java(或者也许现在是开始使用 Kotlin :) 的好时机(....适应我在这里的类似模式,我相信你会做这样的事情:
val query: MutableLiveData<String> = MutableLiveData()
val mList = MediatorLiveData<List<ItemList>>().apply {
this.addSource(query) {
this.value = meliRepository.getItemsByQuery(query)
}
}
fun setQuery(q: String) {
query.value = q
}
我在以下 https://github.com/joreilly/galway-bus-android/blob/master/app/src/main/java/com/surrus/galwaybus/ui/viewmodel/BusStopsViewModel.kt 使用此模式