2017-04-21 11 views
1

J'essaie de fusionner tous les événements de l'interface utilisateur dans un observable, donc je peux réagir à tous les événements, tels que: onCreate cycle de vie, faire défiler les événements de mon RecyclerView, searchEvents de la vue de recherche et deleteEvents de l'activation du mode Action. J'utilise Rxbinding pour y parvenir. J'essaye d'implémenter le modèle de Redux de la présentation de Jake Wharton: http://jakewharton.com/the-state-of-managing-state-with-rxjava/Fusionner tous les événements de l'interface utilisateur à un observable, mais je reçois uniquement le dernier événement fusionné

Résultat actuel: seulement le GetUsersEvent est tiré, tandis que d'autres événements ne le font pas.

Résultat attendu: Tous les événements sont déclenchés si nécessaire.

Merci d'avance. Mon code:

public Observable events; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    events = Observable.just(new GetUsersEvent()); 
    //... boiler plate 
    events.mergeWith(RxRecyclerView.scrollEvents(userRecycler).map(recyclerViewScrollEvent -> { 
     int totalItemCount = layoutManager.getItemCount(); 
     int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition(); 
     if ((layoutManager.getChildCount() + firstVisibleItemPosition) >= totalItemCount 
       && firstVisibleItemPosition >= 0 && totalItemCount >= PAGE_SIZE) { 
      uiModel = new UserListState.Builder(uiModel) 
        .setUsers(uiModel.getUsers()) 
        .setYScroll(firstVisibleItemPosition) 
        .build(); 
      return new UsersNextPageEvent(uiModel.getLastId()); 
     } 
     return null; 
    })); 
} 

@Override 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    mode.getMenuInflater().inflate(R.menu.selected_list_menu, menu); 
    events.mergeWith(RxMenuItem.clicks(menu.findItem(R.id.delete_item)) 
      .map(click -> new DeleteUsersEvent(usersAdapter.getSelectedItemsIds()))); 
    return true; 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.list_menu, menu); 
    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
    SearchView mSearchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); 
    mSearchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); 
    events.mergeWith(RxSearchView.queryTextChanges(mSearchView) 
      .map(query -> new SearchUsersEvent(query.toString())) 
      .doOnNext(searchUsersEvent -> Log.d("searchEvent", "eventFired"))); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    events.compose(userListVM.uiModels(mapEventsToActions, mapActionsToExecutables, stateReducer, 
      DeleteUsersEvent.class, GetUsersEvent.class, SearchUsersEvent.class, UsersNextPageEvent.class)) 
      .compose(bindToLifecycle()).subscribe(new BaseSubscriber<>(this, ERROR_WITH_RETRY)); 
} 

Répondre

1

Eh bien, vous avez une tonne de events.mergeWith(...), mais que faites-vous des résultats? Cette opération vous donne une nouvelle observable.

Vous pouvez faire events = events.mergeWith(...).

+0

Votre solution fonctionne bien, mais cela ne fonctionne pas dans le cas du "onCreateActionMode", avez-vous des suggestions? –

+0

C'est parce que 'onCreateActionMode' est appelé * après * onResume. Vous avez besoin d'un bus d'événement. –