Android架构组件LiveData

时间:2018-01-17 17:46:31

标签: android viewmodel android-architecture-components android-livedata

我尝试使用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!

1 个答案:

答案 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
}

我在以下https://github.com/joreilly/galway-bus-android/blob/master/app/src/main/java/com/surrus/galwaybus/ui/viewmodel/BusStopsViewModel.kt

中使用此模式