我正在按照谷歌教程进行房间持久性,但我被卡住了,现在我的教程一切正常,但我需要扩展它并能够将参数传递给ViewModel
因为我需要的是能够向存储库提交不同的查询,也许我错了,但现在我正在ViewModel
中执行此操作,它应该能够读取他的字段并选择与存储库交谈的正确方法。
字视图模型:
public class WordViewModel extends AndroidViewModel {
private WordRepository mRepository;
private LiveData<List<Word>> mAllWords;
public int mode = 0;
public WordViewModel (Application application) {
super(application);
mRepository = new WordRepository(application);
if (mode==0)
mAllWords = mRepository.getAllWords();
else
mAllWords = mRepository.getSomethingElse();
}
LiveData<List<Word>> getAllWords() { return mAllWords; }
public void insert(Word word) { mRepository.insert(word); }
}
然后在活动中触发模型视图,我们得到了这个
mWordViewModel = ViewModelProviders.of(this).get(WordViewModel.class);
mWordViewModel.mode=1; //MY ADDITION, not working
...
mWordViewModel.getAllWords().observe(this, new Observer<List<Word>>() {
@Override
public void onChanged(@Nullable final List<Word> words) {
// Update the cached copy of the words in the adapter.
adapter.setWords(words);
}
});
...
现在的问题是我所做的字段访问和编辑("模式"字段)不起作用,就像实际调用ViewModel
时该字段被重置一样,因此它始终为 0。我错过了什么?考虑到该模式仅用于解释,最简单的解决方法是什么,最终我需要很多参数(因此无法创建各种ViewModel
)
我认为您遇到了与ViewModel本身的生命周期以及您使用的不同变量等相关的问题。 我建议使用类似MediatorLiveData
的东西来做你想做的事情......例如(顺便说一句,这是在 Kotlin 中,因为这是我用于类似逻辑的内容)
class WordViewModel : ViewModel() {
.....
val mode: MutableLiveData<Int> = MutableLiveData()
val mAllWords = MediatorLiveData<List<Word>>().apply {
this.addSource(mode) {
if (mode.value == 0)
this.value = mRepository.getAllWords()
else
this.value = mRepository.getSomethingElse()
}
}
init {
mode.value = 0
}
fun setMode(m: Int) {
mode.value = m
}
}
我在这里执行此操作的代码是 https://github.com/joreilly/galway-bus-android/blob/master/base/src/main/java/com/surrus/galwaybus/ui/viewmodel/BusStopsViewModel.kt