В MVP находится onClick ответственность View или Presenter?

В шаблоне MVP, который отвечает за обработку кликов на пользовательском интерфейсе?
Например. подход, отличный от MVP, будет выглядеть примерно так:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      totalClicks++;
      counterTextView.setText("Total clicks so far: "+totalClicks);
    }
  });

Использование MVP - это onClick ответственность Presenter? Или View может справиться с этим?
Может кто-то прояснить это?

Ответ 1

OnClick должен вызывать метод Presenter. Вы должны делать свою работу в презентаторе, и если вам нужно обновить ui, вы должны определить метод в своем View и вызвать его из презентатора.

Вам нужен метод для View ex:

public void showCounterCount(final int totalClicks){
     counterTextView.setText("Total clicks so far: "+totalClicks);
}

Также вам нужен метод и переменная в Presenter:

int totalClicks = 0;

public void onCounterButtonClicked(){
    totalClicks++;
    mView.showCounterCount(totalClicks);
}

И отредактируйте свой код следующим образом:

counterButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
      mPresenter.onCounterButtonClicked();
    }
  });

Для более сложной и чистой архитектуры вы можете использовать свой бизнес для использования в интеракторах. (В вашем примере увеличение значения счетчика является прецедентом для вашего приложения)

Вы можете определить интерактора и увеличить его значение счетчика.

CounterInteractor:

public CounterInteractor{
   public int incrementCounter(int currentCounter){
       return currentCounter+1;
   }
}

И реорганизуйте презентатора, как показано ниже:

int totalClicks = 0;
CounterInteractor mCounterInteractor = new CounterInteractor();

public void onCounterButtonClicked(){
    totalClicks = mCounterInteractor.incrementCounter(totalClicks);
    mView.showCounterCount(totalClicks);
}

При таком подходе вы полностью отделяете свою бизнес-логику от докладчиков и используете свои концепции использования без дублирования кода в презентациях. Это более чистый подход.

Вы также можете проверить этот репозиторий git для разных подходов MVP. https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/

Удачи.

Edit:

Здесь мой легкий проект проекта клиента wikipedia: https://github.com/savepopulation/wikilight

Я пытаюсь реализовать MVP. (MVP + Dagger2 + RxJava)