Navigation View- menu podczas chowania się zacina się

0

Robię aplikację, gdzie mam zaimplementowane Navigation View.
W bocznym menu mam 5 różnych opcji do wybrania, każda z tych opcji tworzy nowy fragment.
W nadpisanej metodzie onNavigationItemSelected(MenuItem item) mam switcha z moimi 5 opcjami, gdzie tworzę fragmenty. Przykład

getSupportFragmentManager().beginTransaction().replace(R.id.content_frame, new ItemsFragment()).commit();

Za switchem gdzie tworzę fragmenty wywołuję: drawerLayout.closeDrawer(GravityCompat.START);

I tutaj gdy przechodzę pomiędzy opcjami w menu, jak klikam na opcję, menu podczas chowania ma lagi.

Poszukałem informacji i wychodzi na to, że mogę nadpisać metodę onDrawerClosed(View drawerView) i dopiero w niej podmieniać fragmenty.
Zrobiłem tak i lagowanie nie występuje, menu chowa się płynnie, jednak zajmuje to chwilę i dopiero po zamknięciu menu startuję nowy fragment.

Pytania:

  1. czy są jakieś alternatywy dla rozwiązania mojego problemu oprócz tworzenia fragmentu w metodzie onDrawerClosed(View drawerView)? Myślę sobie, że można by wywołać metodę, która zajęłaby się tworzeniem nowego fragmentu w innym wątku np poprzez AsyncTask(tą metodę umieściłbym w onNavigationItemSelected). Ma to sens? Fragmenty które mi się zacinają mają recyclerview z live datą, gdzie mam listę 50 elementów pobieraną z lokalnej bazy danych. Zapytanie jest proste. Recycler view i live data są zrobione zgodnie z dokumentacją. Uważam, że tu nie ma problemu i wszystko jest ok.

  2. W momencie gdy użytkownik musi zaczekać aż jakaś operacja się zakończy planuję użyć ProgressBar. Będę go wyświetlał kiedy fragment(recyclerview 50 elementów + live data) mi się ładuje, czy ten widget jest ok? Nie podoba mi się sytuacja, że zamykam menu i czekam 1 - 2 sekundy aż fragment mi się pojawi.

1
  1. To nie ma sensu. Problemem nie jest tworzenie fragmentu, tylko układanie jego zawartości podczas animacji DrawerLayout. Nawet w dokumentacji jest o tym napisane.

DrawerLayout.DrawerListener can be used to monitor the state and motion of drawer views. Avoid performing expensive operations such as layout during animation as it can cause stuttering; try to perform expensive operations during the STATE_IDLE state. DrawerLayout.SimpleDrawerListener offers default/no-op implementations of each callback method.

Jeśli irytuje Cię, że onDrawerClosed nie jest wywoływany zaraz po zamknięciu widoku, to możesz skorzystać z hacka w postaci wysłania wiadomości z około 200 ms opóźnieniem. Jest to często proponowane rozwiązanie i używane przez niektóre popularne aplikacje, jak na przykład Phonograph.

  1. ProgressBar może być stosowany, żeby pokazać ładowanie zawartości na ekranie. Do samej podmiany widoków bym go raczej nie używał, ale nie jest to jakieś okropne rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1