将参数传递给 AndroidViewModel



我正在按照谷歌教程进行房间持久性,但我被卡住了,现在我的教程一切正常,但我需要扩展它并能够将参数传递给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

相关内容

  • 没有找到相关文章

最新更新