Передача аргументов в AndroidViewModel - PullRequest
0 голосов
/ 16 мая 2018

Я слежу за обучением Google для постоянства комнаты, но я застрял, сейчас у меня все учебное пособие работает нормально, но мне нужно его расширить и я могу передавать параметры в ViewModel потому что мне нужно иметь возможность отправлять различные запросы в репо, и, возможно, я ошибаюсь, но сейчас я делаю это в ViewModel, который должен быть в состоянии прочитать его поле и выбрать правильный метод для поговорить с репо.

WordViewModel:

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);
   }
});
...

Теперь проблема в том, что поле доступа и редактирования (поле «mode»), которое я создал, не работает, это похоже на то, что поле сбрасывается при фактическом вызове ViewModel, и поэтому всегда равно 0. Что я скучаю? Какой самый простой обходной путь, учитывая, что этот режим только для объяснения, и в конечном итоге мне понадобится много параметров (поэтому создание различных ViewModel не вариант)

1 Ответ

0 голосов
/ 16 мая 2018

Я думаю, что вы сталкиваетесь с проблемами, связанными с жизненным циклом самой 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

...