我尝试使用Architecture Components实现一个简单的应用程序。 我可以使用Retrofit2从RestApi服务获取信息。 我可以在相应的Recyclerview中显示信息,当我旋转手机时,一切正常。 现在我想通过一种新的对象(按字符串)过滤
有人可以用ViewModel指导我一点,我不知道这样做的最佳做法是什么...... 我正在使用MVVM ......
这是我的ViewModel:
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)
);
}
}
更新
我使用转换生命周期库中的包来解决这个问题... enter link description here
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这是我的解决方案。我使用生命周期库,解决方案比我想象的要容易。 THX!
答案 0 :(得分:1)
我更熟悉在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
}
中使用此模式