5

Ciao Sto creando un'app con A fragment e pochi bambini fragment al suo interno utilizzando tablayout e viewpager. Il problema è tutto mio figlio (dal Tablayout) sempre eseguito (carica tutto il codice all'interno ogni volta che l'utente fa clic sul genitore fragment. Come ottenere il bambino fragment caricare solo quando l'utente lo fa scorrere (ad esempio ho 2 schede, contenuto nella scheda 2 caricare solo quando scivolo all'utente di scheda 2)Il frammento in TabLayout viene caricato solo quando l'utente fa scorrere Android

Ecco il mio genitore fragment codice

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]; 
     } 

    } 

} 

E il mio frammento di codice figlio. voglio che questi codice eseguire solo ogni volta che la diapositiva utente alla scheda del bambino. Qualsiasi aiuto è molto apprezzato, Grazie

@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 (isVisibleToUser booleano) { super.setUserVisibleHint (isVisibleToUser); } ' – k0sh

+0

grazie per la replica anni. Puoi descrivere un po 'più di dettaglio. Ho bisogno di mettere il suddetto codice frammento figlio su @Override public void setUserVisibleHint (boolean isVisibleToUser) {super.setUserVisibleHint (isVisibleToUser); }? –

+0

Quando Android aggiungerà semplicemente una richiamata al tabView? – Zapnologica

risposta

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

si potrebbe usare metodo di cui sopra all'interno del tuo frammento che è dentro il ViewPagerAdapter

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

essere consapevoli di non inizializzare vista lì o qualcosa di meglio, init vostri punti di vista all'interno di onViewCreated e chiamare il metodo che vuoi eseguire su setUserVisibleHint. un altro brutto modo è quello di aggiungere un listener di scorrimento al tuo ViewPager e ottenere la posizione corrente dell'elemento e attivare un'azione all'interno del frammento. per ottenere il frammento dal ViewPagerAdapter si può fare ad esempio:

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

allora si potrebbe chiamare un metodo che è dentro MyFragment

+0

Ho provato il primo metodo, ma non sembra funzionare. Sposto tutto il codice vista su OnCreateView e ho lasciato solo il metodo per recuperare i dati getEventDetailRespond (requestQueue); all'interno di @Override public void setUserVisibleHint (boolean isVisibleToUser) { super.setUserVisibleHint (isVisibleToUser); } ma ho ottenuto errore puntatore nullo (ho progressbar.setvisibillity all'interno di getEventDetailRespond –

+0

invece di usare getChildFragmentManager() potrei chiamare getActivity(). GetSupportFragmentManager() e vedere se lo risolve? Comunque ti incoraggio comunque a fare un po 'di debug la risposta che ho fornito. – k0sh

+0

sembra funzionare con un semplice messaggio di test Toast ma quando inserisco il mio metodo di recupero dati restituisce un puntatore nullo, ecco il mio codice metodo e l'errore mostrato https://docs.google.com/document/d/16APWQippnSNr0_BWqDQd36kzRA6IpbsLSHKIt0xgEFY/edit –

1

Il Viewpager da carichi di default il frammento adiacente per assicurare rendere l'applicazione uniforme, in modo da che quando l'utente passa ai frammenti (già caricati) è lì. Per modificare il comportamento predefinito, utilizzare viewpager.setOffscreenPageLimit(int limit) dove il limite è il numero di frammenti accanto a quello in cui ci si trova saranno precaricati. Spero che questo aiuti

+0

grazie mille. Quindi, per impostazione predefinita se ho 3 frammenti, verrà caricato solo il primo 2 frammento quando l'utente fa clic sul frammento principale? dove mettere il viewsetOffscreenPageLimit (int limit) (su genitore o figlio)? può dare un po 'di dettagli su come implementarlo? –

+0

Ho fatto un errore nella mia risposta. già modificato. È possibile chiamare tale metodo su ViewPager. –

+0

Mi sembra di non lavorare. Ho 2 frammenti di bambini. Quando metto viewpager.setOffscreenPageLimit (0) nel mio padre OnCreateView. tutto il codice dal frammento figlio 2a scheda è ancora caricato ogni volta che l'utente fa clic sul frammento principale –