5

Witam Tworzę aplikację z A fragment i kilkoma dziećmi fragment w środku za pomocą tablayout i viewpager. Problem polega na tym, że moje dziecko fragment (od Tablayout) zawsze wykonuje (ładuje cały kod w środku, gdy użytkownik kliknie na rodzica fragment.Jak pobrać dziecko fragment ładuje się tylko za każdym razem, gdy użytkownik się do niego zbliży (na przykład mam 2 zakładki, zawartość w karcie 2 załadować tylko gdy użytkownik przejdź do zakładki 2)Fragment w TabLayout ładuje się tylko podczas przesuwania użytkownika Android

Oto mój rodzic kod fragment

public class ManageEventFragment extends Fragment { 


    public ManageEventFragment() { 
     // Required empty public constructor 
    } 


    TabLayout tabLayout; 
    ViewPager viewPager; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View viewFragment = inflater.inflate(R.layout.fragment_manage_event, container, false); 

     viewPager = (ViewPager) viewFragment.findViewById(R.id.viewPager); 

     tabLayout = (TabLayout) viewFragment.findViewById(R.id.tabLayout); 

     viewPager.setAdapter(new CustomAdapter(getChildFragmentManager(), getContext())); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 

     return viewFragment; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 

     //  tabLayout.setupWithViewPager(viewPager); 
     tabLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       tabLayout.setupWithViewPager(viewPager); 
      } 
     }); 

     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 
     }); 

     if (ViewCompat.isLaidOut(tabLayout)) { 
      tabLayout.setupWithViewPager(viewPager); 
     } else { 
      tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
       @Override 
       public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
        tabLayout.setupWithViewPager(viewPager); 
        tabLayout.removeOnLayoutChangeListener(this); 
       } 
      }); 
     } 

     super.onActivityCreated(savedInstanceState); 

    } 


    //TabLayout and ViewPager class 
    private class CustomAdapter extends FragmentPagerAdapter { 

     private String fragments[] = {"Edit Event", "Create Event"}; 

     public CustomAdapter(FragmentManager fragmentManager, Context context) { 
      super(fragmentManager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new EditEventFragment(); 
       case 1: 
        return new CreateEventFragment(); 
       default: 
        return null; 
      } 
     } 

     @Override 
     public int getCount() { 
      return fragments.length; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return fragments[position]; 
     } 

    } 

} 

A moje dziecko fragment kodu. Chcę to kod tylko wykonać, gdy suwak użytkownikowi karty podrzędnej. Każda pomoc jest bardzo wdzięczna, Dzięki

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     //Initializing our listEvents list 
     listEvents = new ArrayList(); 

     recyclerView.setHasFixedSize(true); 
     layoutManager = new LinearLayoutManager(getContext()); 
     recyclerView.setLayoutManager(layoutManager); 

     adapter = new EventAdapterEdit(getContext(),listEvents); 
     recyclerView.setAdapter(adapter); 


     requestQueue = Volley.newRequestQueue(getContext()); 

     adapter = new EventAdapterEdit(getContext(),listEvents); 
     recyclerView.setAdapter(adapter); 

     getEventDetailRespond(requestQueue); 
+0

'@Override public void setUserVisibleHint (boolean isVisibleToUser) { super.setUserVisibleHint (isVisibleToUser); } ' – k0sh

+0

dzięki za lata rep. Czy możesz opisać nieco więcej szczegółów. Potrzebuję umieścić powyższy kod fragmentu dziecka na @Override public void setUserVisibleHint (boolean isVisibleToUser) {super.setUserVisibleHint (isVisibleToUser); }? –

+0

Kiedy Android doda połączenie zwrotne do tabView? – Zapnologica

Odpowiedz

4
@Override public void setUserVisibleHint(boolean isVisibleToUser) { 
    super.setUserVisibleHint(isVisibleToUser); 
} 

można użyć powyższej metody w swoim fragmencie, który jest w zasięgu twojej ViewPagerAdapter

if(isVisibleToUser){//dosomething when the fragment is visible} 
else{//dosomething else.} 

mieć świadomość, aby nie inicjować widoki tam albo coś raczej, init swoje poglądy w ciągu onViewCreated i wywołać metodę, która chcesz wykonać na setUserVisibleHint. Innym brzydkim sposobem jest dodanie słuchacza przewijania do twojej ViewPager i uzyskanie aktualnej pozycji przedmiotu i wywołanie akcji znajdującej się w tym fragmencie. aby uzyskać fragment z ViewPagerAdapter można zrobić takie:

MyFragment frag = (MyFragment) pager.getAdapter().instantiateItem(pager, position); 

następnie można wywołać metodę, która jest w zasięgu MyFragment

+0

Próbowałem pierwszej metody, ale nie wydaje się działać. Przeniosłem cały kod widoku do OnCreateView i zostawiłem tylko metodę pobierania danych getEventDetailRespond (requestQueue); inside @Override public void setUserVisibleHint (boolean isVisibleToUser) { super.setUserVisibleHint (isVisibleToUser); } ale błąd wskaźnika null (Mam progressbar.setvisibillity wewnątrz getEventDetailRespond –

+0

zamiast używać getChildFragmentManager() może wywołać getActivity(). GetSupportFragmentManager() i sprawdzić, czy to rozwiązać? Jednak nadal zachęcam do niektórych debugowania na Odpowiedź brzmiała: – k0sh

+0

wydaje się działać z prostą testową wiadomością Toast, ale kiedy umieszczam moją metodę pobierania danych, zwracam pusty wskaźnik, tutaj znajduje się kod metody i wyświetlany błąd https://docs.google.com/document/d/16APWQippnSNr0_BWqDQd36kzRA6IpbsLSHKIt0xgEFY/edit –

1

The Viewpager domyślnie ładunku sąsiedni fragment w celu zapewnienia, aby aplikacja gładka, tak że gdy użytkownik przesunie palcem do fragmentów (już załadowanych), jest tam. Aby zmienić domyślne zachowanie, użyj viewpager.setOffscreenPageLimit(int limit), gdzie limit to liczba fragmentów obok tego, na którym się znajdujesz, zostanie wstępnie załadowana. Mam nadzieję, że to pomaga

+0

wielkie dzięki. Tak więc domyślnie, jeśli mam 3 fragmenty, tylko pierwszy 2 fragment zostanie załadowany, gdy użytkownik kliknie fragment macierzysty? gdzie umieścić viewsetOffscreenPageLimit (limit int) (na rodzic lub dziecko)? może podać trochę szczegółów, jak to wdrożyć? –

+0

Zrobiłem literówkę na moją odpowiedź. już edytowane. Możesz wywołać tę metodę na ViewPager. –

+0

Wydaje mi się nie działać. Mam 2 fragment podrzędny. Kiedy umieszczam viewpager.setOffscreenPageLimit (0) w moim nadrzędnym OnCreateView. cały kod z fragmentu potomnego Druga karta jest nadal ładowana za każdym razem, gdy użytkownik kliknie fragment rodzica. –

Powiązane problemy