我有2个实时数据,我将它们作为源添加到一个mediator实时数据中,我从一个视图模型中暴露出这个数据,让一个片段来观察。
当任何一个实时数据发生变化时,它都会触发mediator实时数据的onChanged方法,这意味着我的观察者会被触发两次,我想要的是将两者结合起来,只观察一个只触发一次的流,我是否有遗漏的地方,或者我是否需要为此推出我自己的方法? 目前我这样做,它触发了两次。
为保证安全,删除了一些代码。
public CardViewModel(@NonNull Application application , int clicks, String[] cardArgs){
sentenceRepository = new SentenceRepository(application);
cards = Transformations.switchMap(search, mySearch -> sentenceRepository.searchLiveCardListByWordTypeAndWordDescriptionAndSearchWord(cardArgs[0],cardArgs[1],mySearch));
groupRepository = new GroupRepository(application);
groups = groupRepository.getGroupsByWordDescriptionAndWordType(cardArgs[0],cardArgs[1]);
sentencesAndGroups = new MediatorLiveData<>();
sentencesAndGroups.addSource(cards, sentences -> {
Log.d(TAG,"addSource cards");
sentencesAndGroups.setValue(combineLatest(sentences, groups.getValue()));
});
sentencesAndGroups.addSource(groups, groupsWithSentences -> {
Log.d(TAG,"addSource groups");
sentencesAndGroups.setValue(combineLatest(cards.getValue(), groupsWithSentences));
});
}
private List<Visitable> combineLatest(List<Sentence> sentenceList, List<GroupsWithSentences> groupsWithSentences) {
List<Visitable> visitableList = new ArrayList<>();
if (sentenceList != null){
visitableList.addAll(sentenceList);
}
if (groupsWithSentences != null){
visitableList.addAll(groupsWithSentences);
}
return visitableList;
}
任何帮助?
你可以使用一个 BiFunction
. 在我的项目中,我有一个包含这个的类。
public class MultipleLiveDataTransformation {
@MainThread
public static <X, Y, O> LiveData<O> biMap(LiveData<X> data1, LiveData<Y> data2, final BiFunction<X, Y, O> biFun) {
final MediatorLiveData<O> result = new MediatorLiveData<>();
result.addSource(data1, x -> result.setValue(biFun.apply(x, data2.getValue())));
result.addSource(data2, y -> result.setValue(biFun.apply(data1.getValue(), y)));
return result;
}
}
你可以像这样使用它。
public LiveData<Visitable> getVisitables() {
return MultipleLiveDataTransformation.biMap(groups, sentences, (gro, sen) -> {
List<Visitable> visitableList = new ArrayList<>();
if (gro != null) {
visitableList.addAll(gro);
}
if (sen != null) {
visitableList.addAll(sen);
}
return visitableList;
});
}
我不完全明白你有什么列表,你想观察什么。我在这里给出的例子可以观察两个 LiveData
对象,并在其中一个对象需要更新时触发。它总是会给你提供最新版本的 Visitable
对象。
如果我不明白这个问题,你能解释一下什么是 LiveData
对象需要组合,结果是什么?
在这种情况下,一个额外的 LiveData
的对象中需要观察 MultipleDataTransformation
,它可以使 triMap
.
编辑:你可以试试这个。
public LiveData<Visitable> getVisitables() {
return MultipleLiveDataTransformation.biMap(groups, sentences, (gro, sen) -> {
List<Visitable> visitableList = new ArrayList<>();
if (gro != null && !gro.isEmpty() && sen != null && !sen.isEmpty()) {
visitableList.addAll(gro);
visitableList.addAll(sen);
}
return visitableList;
});
}