gpt4 book ai didi

android - 具有多个参数的 MediatorLiveData 或 switchMap 转换

转载 作者:IT王子 更新时间:2023-10-28 23:36:09 25 4
gpt4 key购买 nike

我正在使用 Transformations.switchMap在我的 ViewModel 中,所以在我的 fragment 中观察到的 LiveData 集合会对 code 参数的更改使用react。

这很好用:

public class MyViewModel extends AndroidViewModel {

private final LiveData<DayPrices> dayPrices;
private final MutableLiveData<String> code = new MutableLiveData<>();
// private final MutableLiveData<Integer> nbDays = new MutableLiveData<>();
private final DBManager dbManager;

public MyViewModel(Application application) {
super(application);
dbManager = new DBManager(application.getApplicationContext());
dayPrices = Transformations.switchMap(
code,
value -> dbManager.getDayPriceData(value/*, nbDays*/)
);
}

public LiveData<DayPrices> getDayPrices() {
return dayPrices;
}

public void setCode(String code) {
this.code.setValue(code);
}

/*public void setNbDays(int nbDays) {
this.nbDays.setValue(nbDays);
}*/

}

public class MyFragment extends Fragment {

private MyViewModel myViewModel;

myViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
myViewModel.setCode("SO");
//myViewModel.setNbDays(30);
myViewModel.getDayPrices().observe(MyFragment.this, dataList -> {
// update UI with data from dataList
});
}

问题

我现在需要另一个参数(nbDays 在上面的代码中注释),以便我的 LiveData 对象对两个参数的变化使用react(codenbDays)。

如何链接转换?

一些阅读将我指向 MediatorLiveData ,但它并没有解决我的问题(仍然需要使用2个参数调用单个DB函数,我不需要合并2个liveDatas)。

所以我尝试了这个而不是 switchMapcodenbDays 始终为空。

dayPrices.addSource(
dbManager.getDayPriceData(code.getValue(), nbDays.getValue),
apiResponse -> dayPrices.setValue(apiResponse)
);

一种解决方案是将对象作为单个参数传递,我很确定有一个简单的解决方案。

最佳答案

来源:https://plus.google.com/+MichielPijnackerHordijk/posts/QGXF9gRomVi

switchMap()要有多个触发器,需要使用自定义的MediatorLiveData来观察LiveData对象的组合——

class CustomLiveData extends MediatorLiveData<Pair<String, Integer>> {
public CustomLiveData(LiveData<String> code, LiveData<Integer> nbDays) {
addSource(code, new Observer<String>() {
public void onChanged(@Nullable String first) {
setValue(Pair.create(first, nbDays.getValue()));
}
});
addSource(nbDays, new Observer<Integer>() {
public void onChanged(@Nullable Integer second) {
setValue(Pair.create(code.getValue(), second));
}
});
}
}

那么你就可以这样做了-

CustomLiveData trigger = new CustomLiveData(code, nbDays);
LiveData<DayPrices> dayPrices = Transformations.switchMap(trigger,
value -> dbManager.getDayPriceData(value.first, value.second));

如果您使用 Kotlin 并希望使用泛型:

class DoubleTrigger<A, B>(a: LiveData<A>, b: LiveData<B>) : MediatorLiveData<Pair<A?, B?>>() {
init {
addSource(a) { value = it to b.value }
addSource(b) { value = a.value to it }
}
}

然后:

val dayPrices = Transformations.switchMap(DoubleTrigger(code, nbDays)) {
dbManager.getDayPriceData(it.first, it.second)
}

关于android - 具有多个参数的 MediatorLiveData 或 switchMap 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49493772/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com