AAC: Как вернуть результат (обработать щелчок) из ViewModel в действие? - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу использовать в своем проекте Компоненты архитектуры Android (AAC) .Приятно.

Вот моя активность:

    import androidx.appcompat.app.AppCompatActivity;
    public class TradersActivity extends AppCompatActivity  {
        private TradersViewModel tradersViewModel;

         @Override
         protected void onCreate(@Nullable Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);


              tradersViewModel = ViewModelProviders.of(this).get(TradersViewModel.class);

              tradersViewModel.getIsEnableSwipeProgress().observe(this, new Observer<Boolean>() {

                    @Override
                    public void onChanged(Boolean isEnable) {
                        // do some work with UI
                    }
                });

        }

        // button click        
        public void onClickViewJson(Trader trader) {
             tradersViewModel.doClickJsonView(trader);
        }

    }

Вот моя ViewModel

public class TradersViewModel extends ViewModel {
private MutableLiveData<Boolean> isEnableSwipeProgress = new MutableLiveData<>();

 public void doClickJsonView(Trader trader) {
      // DO_SOME_COMPLEX_BUSINESS_LOGIC
 }

 public MutableLiveData<Boolean> getIsEnableSwipeProgress() {
      return isEnableSwipeProgress;
 }

}

На экране у меня есть кнопка.И когда я нажимаю эту кнопку, я вызываю метод действия - onClickViewJson(Trader trader).

Этот вызов метода tradersViewModel.doClickJsonView(trader);

В viewModel этот метод выполняет сложную бизнес-логику.После того, как метод завершит свою работу, мне нужно вернуть результат ( json ) в мою деятельность.

Как я могу это сделать?

1 Ответ

0 голосов
/ 20 февраля 2019

Помните, что в MVVM ViewModels не имеет представления о вашем представлении.Ваша ViewModel должна предоставлять переменные, чтобы ваши представления могли наблюдать и реагировать на них.

 private MutableLiveData<Boolean> isEnableSwipeProgress = new MutableLiveData<>();

 private MutableLiveData<JSONDto> jsonLiveData = new MutableLiveData<>();

 public void doClickJsonView(Trader trader) {
      // DO_SOME_COMPLEX_BUSINESS_LOGIC
      jsonLiveData.postValue(/* the json you obtain after your logic finish */ )
 }

 public MutableLiveData<Boolean> getIsEnableSwipeProgress() {
      return isEnableSwipeProgress;
 }

 public LiveData<JSONDto> getJsonDto() {
      return this.jsonLiveData;
 }


И, на ваш взгляд, вы реагируете на ваши jsonDto изменения:

tradersViewModel.getJsonDto().observe(this, new Observer<JSONDto>() {

                    @Override
                    public void onChanged(JSONDto json) {
                         if (json != null) {
                           // Do what you need here.
                         }
                    }
                });
...