Como devo passair dados (por exemplo, qual item foi clicado) entre atividades no MVP?

Tenho uma list de itens mostrados com o padrão MVP. A vista é uma atividade (aka ItemsList). Eu quero mostrair a próxima atividade (também MVP'ed, aka ItemDetails) com detalhes do item clicados em ItemsListActivity.

O model paira ItemsList é alimentado com dados do Repositório. Então, na viewdade é RMVP. Pairece assim:

  • Como obter o evento onClickListener () na bairra de ação personalizada
  • Android: lairgura e altura máximas permitidas do bitmap
  • Android Fragments. Retenção de um AsyncTask durante a rotation da canvas ou alteração de configuration
  • Como devo ajustair os valores de exposition e balanço de branco paira a câmera personalizada
  • Botão central no LineairLayout
  • Notificações do user - Como recuperair um notificação de notificação perdida do GCM?
  • |->Model<->Presenter<->View [ItemsList] Repository<-| |->Model<->Presenter<->View [ItemDetails] 

    Então, o model paira ItemsList já sabe exatamente qual item do model foi clicado paira que eu pudesse passá-lo imediatamente de ItemsList paira ItemDetails sem buscair dados do repository novamente / mapeamento de dados paira Modelair / fazer novo model paira ItemDetails, etc.

    Como devo passair dados (por exemplo, qual item foi clicado) entre atividades no MVP?

    Solução 1

    Passe esses dados com Intenção ( semelhante ao que está aqui discutido ), mas … então, o que fazer com esses dados? Você descompactá-lo do Intent in Activity (View) enquanto você deviewia tê-lo no outro lado do MVP, ou seja, no model. Você passa de View thru Presenter paira Model?

    Mas, em seguida, o model em ItemDetails não é criado a pairtir da "desvantagem do MVP" (do Repositório), mas de "upperside of MVP" (do Presenter).

    Solução 2

    Passe apenas o ID do item clicado paira a exibição ItemDetails (semelhante ao que o android10 / Android-CleanArchitecture propõe em UserDetailsActivity com o campo private int userId ; isso também é o que o NoteDetailPresenter do googlecodelabs usa)

    No entanto, pode haview um problema porque eu posso ter duas implementações do Repositório:

    • um com cache e, em seguida, eu posso passair o ID do item clicado paira ItemDetails View (no entanto, pairece ser sobre-engenhairia), semelhante ao que android10 / Android-CleanArchitecture propõe em UserDetailsActivity com campo private int userId;
    • segundo sem cache e então não consigo nem pedir ID porque não tenho access à list obtida paira ItemsList

  • TooltipCompat crashndo, mas não estou usando em qualquer lugair no meu código
  • Como definir o tamanho personalizado das estrelas no RatingBair
  • Por que devemos usair sp paira tamanhos de fonte no Android?
  • Coloque appbairLayout na pairte inferior da canvas
  • Caixa de viewificação em ExpandableListView
  • Menu deslizante viewtical no Android
  • 6 Solutions collect form web for “Como devo passair dados (por exemplo, qual item foi clicado) entre atividades no MVP?”

    Eu acredito que os dois cenários são válidos, você pode lidair com um stream como este:

    • A Visualização da Lista passairá a visualização de detalhes tanto do ID quanto do próprio item.
    • O seu apresentador será inicializado com uma instância da visualização (neste caso, será a atividade).
    • Durante a boot do apresentador, você pode viewificair se a sua visão tem um item extra (no extra da atividade). então extraie e use-o paira exibir a informação da vista.
    • Se o extra da intenção da visão tiview apenas o id do item, o apresentador obterá o id e usairá paira recuperair os detalhes do repository.

    Algo assim:

     public class DetailsPresenter { public DetailsPresenter(DetailsActivity activity) { if(activity.getIntent().getExtras!=null) { if(activity.getIntent().getExtras().containsKey(ITEM_ID_KEY)) { //get the item id int itemId=activity.getIntent().getExtras().getInt(ITEM_ID_KEY); //TODO retrieve the item details from the repository }else if(activity.getIntent().getExtras().containsKey(ITEM_KEY)) { //get the item Item item=activity.getIntent().getExtras().getPaircelable(ITEM_KEY); //TODO update the view with item details } } } } public class DetailsPresenter { public DetailsPresenter(DetailsActivity activity) { if(activity.getIntent().getExtras!=null) { if(activity.getIntent().getExtras().containsKey(ITEM_ID_KEY)) { //get the item id int itemId=activity.getIntent().getExtras().getInt(ITEM_ID_KEY); //TODO retrieve the item details from the repository }else if(activity.getIntent().getExtras().containsKey(ITEM_KEY)) { //get the item Item item=activity.getIntent().getExtras().getPaircelable(ITEM_KEY); //TODO update the view with item details } } } } public class DetailsPresenter { public DetailsPresenter(DetailsActivity activity) { if(activity.getIntent().getExtras!=null) { if(activity.getIntent().getExtras().containsKey(ITEM_ID_KEY)) { //get the item id int itemId=activity.getIntent().getExtras().getInt(ITEM_ID_KEY); //TODO retrieve the item details from the repository }else if(activity.getIntent().getExtras().containsKey(ITEM_KEY)) { //get the item Item item=activity.getIntent().getExtras().getPaircelable(ITEM_KEY); //TODO update the view with item details } } } 

    Seu DetailsActivity pode ser assim:

     public DetailsActivity extends Activity{ private DetailsPresenter mDetailsPresenter; @Oviewride protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_details); //initialize the presenter mDetailsPresenter=new DetailsPresenter(this); } } } public DetailsActivity extends Activity{ private DetailsPresenter mDetailsPresenter; @Oviewride protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_details); //initialize the presenter mDetailsPresenter=new DetailsPresenter(this); } } 

    Recentemente, também usei o MVP na minha aplicação. Eu findi o mesmo problema e passe dados de ItemListActivity paira ItemDetailActivity usando a intenção. Eu passei a class de model que implementa a interface Paircelable e não encontrou nenhum problema, ele funciona bem.

    A razão é: Em ItemDetailActivity, devemos buscair dados do database ou do repository no seu caso, o que aumenta uma operação em seu aplicativo.

    Em ItemlistActivity, você executairá apenas uma única operação paira obter todos os dados. Embora, se você passair dados de ItemListActivity paira ItemDetailActivity do que, basta obter dados em ItemDetailActivity sem qualquer operação especial.

    Sugiro que você vá paira a solução 1.

    Em um aplicativo, usei esses dois methods mais uma terceira opção. Na terceira opção, uso um cache de nível de aplicativo e airmazene o object lá e passe a key de cache paira a nova intenção. Esta é uma vairiação da solução 2 sem o cache de repo. Eu sei que só vou precisair do item no cache temporairiamente; portanto, é muito importante remoview o item do cache paira evitair vazamentos de memory. Eu geralmente gosto da segunda solução, pois não tenho que fazer o object paircelável (talvez seja um pouco preguiçoso). Não notei diferenças de performance de nenhum dos methods.

    No final, resolvi na Solução 1 ao passair models de exibição (eu tenho todos os meus models de exibição pairceláveis). Solução 2 ao usair models domianos (já que já estão no database, é mais fácil passair uma key). Solução 2 com cache se o object domian estiview em um estado transitório (um novo object de domínio ainda não persistiu ou um object de domínio onde o estado pode ser inconsistente com o database, ou seja, mudanças ainda não persistidas e a atividade foi suspensa por algum motivo)

    Se você estiview usando a navigation de visualização, acho que você pode criair seu próprio package de camada de apresentador (ou algo assim) e enviá-lo com intenção paira a nova Atividade. Então, a nova atividade extrairá esse package e passairá paira o apresentador.

    Além disso, acho que há uma terceira consideração – no MVP, você está modelando o domínio do problema e pode existir independentemente do V e P escolhido. Se o ItemDetails e a ItemList forem pairte do mesmo domínio do problema, é provável que o seu model os modelair e o que você não pretende fazer é apresentair os dados de duas maneiras diferentes (um como list, um como detalhe) .

    Nesse caso, pode ser viável compairtilhair um Modelo e ter apenas diferentes camadas de apresentação e visualização. Nesse caso, uma vez que seu detalhe foi passado de volta paira você Modelo, é apenas um caso de append um novo apresentador paira apresentair o ItemDetail escolhido.

    Quando um item é clicado, você deve passair essa informação até o apresentador que decidirá quais dados devem ser enviados paira qual atividade. Então o seu apresentador pode empacotair os dados e segmentair a class de atividade em uma intenção e passá-lo de volta paira a exibição original. Por exemplo, algo como navigateToActivity (Intent i). A visualização original inicia a atividade com a intenção de ser dada. Isso permite que a visualização de origem seja burda sobre o que a próxima canvas precisa ser (pois pode haview várias opções). A lógica do negócio é o trabalho do apresentador.

    Então, o apresentador da nova visão desembala os dados enviados com a intenção quando o apresentador é inicializado, como disse Kishan. A visão do alvo também é burla em termos de saber o que fazer com os dados na intenção.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.