我有一个视图模型,该模型指向我的Room数据库,并且之间有一个存储库。我想根据它们的ID获取一堆对象,我的存储库指向我的dao,存储库获取字符串列表,然后将我的对象作为实时数据返回给我,一切正常。
现在,我想从循环中执行此操作,因此我将拥有一个列表列表,并且想要为每个列表获取一个对象列表,因此我在视图模型中设置了一个开关映射,并在需要时进行切换我的列表(现在是可变的实时数据)发生了变化,但这仅适用于我设置的最后一个值。
它有效地发挥了作用,(使其等待节流,所以在更改之前等待了半秒钟)是否有人知道是这种情况,以及如何进行操纵以使其在每次更改时触发?
这是我的大多数视图模型
public class SentenceListViewModel extends AndroidViewModel {
private MutableLiveData<List<String>> idsList;
private LiveData<List<Sentence>> sentenceList;
private SentenceRepository sentenceRepository;
private String TAG = "PreviousSentence";
public SentenceListViewModel(@NonNull Application application) {
super(application);
sentenceRepository = new SentenceRepository(application);
sentenceList = new MutableLiveData<>();
idsList = new MutableLiveData<>();
sentenceList = Transformations.switchMap(idsList, ids ->
sentenceRepository.getLiveCardsByIds(ids));
}
public LiveData<List<Sentence>> getSentenceList() {
return sentenceList;
}
public void setIdsList(List<String> idsList) {
this.idsList.setValue(idsList);
}
}
要设置我的视图模型,我有两种方法,一种是设置视图模型,第二种是注册观察者,这两种方法在onCreate中一个接一个地调用
private void setUpSentenceViewModel(){
sentenceListViewModel =
ViewModelProviders.of(this).get(SentenceListViewModel.class);
sentenceListViewModel.setIdsList(new ArrayList<>());
}
设置观察者-在setUpSentenceViewModel之后调用
private void setUpSentenceViewModelObserver(){
sentenceListViewModel.getSentenceList().observe(this, new
Observer<List<Sentence>>() {
@Override
public void onChanged(List<Sentence> sentences) {
Log.d(TAG,"onChanged");
if (sentences != null){
if (!sentences.isEmpty()){
Log.d(TAG,"...doStuff");
}
}
}
});
}
设置完这些后,我有一个for循环,可以像这样更新视图模型(idsList)中的句子列表的值
for (Sentence s : myUser.getSentences()){
if (s.getSentenceWordType().equals(Constants.SENTENCE)){
sentenceGroupList.add(new SentenceGroup(s));
Log.d(TAG,"SET IDS");
setSentenceViewModelIds(s.getSentences());
}
}
setSentenceViewModelIds-
private void setSentenceViewModelIds(List<String> sentenceIds){
sentenceListViewModel.setIdsList(sentenceIds);
}
这些日志的结果是
onChanged-(这是初始化)
设置ID
设置ID
onChanged
... doStuff
我期望结果是这样的
onChanged-(这是初始化)
设置ID
设置ID
onChanged
... doStuff
onChanged
... doStuff
由于它是异步的,因此可能略有变化
有人对此有任何见识吗?
编辑
打开switchmap的返回lambda并添加一条日志语句(打印“ switch”),表明它已被调用并触发,可能仅仅是更新太快了吗?但是可以肯定的是,它仍然应该将所有结果传递给观察者,不是吗?
新日志
onChanged-(初始化)
设置6个IDS
开关
设置3个IDS
开关
设置3个IDS
开关
设置3个IDS
开关
设置1个IDS
开关
设置2个IDS
开关
onChanged
... doStuff