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));
}
Votre solution fonctionne bien, mais cela ne fonctionne pas dans le cas du "onCreateActionMode", avez-vous des suggestions? –
C'est parce que 'onCreateActionMode' est appelé * après * onResume. Vous avez besoin d'un bus d'événement. –