Android Architecture Components LiveData



我正在尝试使用架构组件实现一个简单的应用程序。我可以使用 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 使用此模式

相关内容

  • 没有找到相关文章