with viewpager tablayout studio fragments example activity android android-fragments android-viewpager android-tablayout

viewpager - Fragmento en TabLayout solo se carga cuando el usuario desliza Android



tablayout android (2)

El Viewpager carga de forma predeterminada el fragmento adyacente para asegurar que la aplicación sea uniforme, de modo que cuando el usuario deslice los fragmentos (ya cargados) esté allí. Para cambiar es el comportamiento predeterminado, utilice viewpager.setOffscreenPageLimit(int limit) donde límite es cuántos fragmentos junto a la que está precargada. Espero que esto ayude

Hola, estoy creando una aplicación con un fragment y algunos fragment secundarios dentro usando tablayout y viewpager . El problema es que todo mi fragment hijo (de Tablayout ) siempre se ejecuta (carga todo el código dentro cuando el usuario hace clic en el fragment principal. Cómo hacer que el fragment hijo solo se cargue cada vez que el usuario se desliza a él (por ejemplo, tengo 2 pestañas, contenido en la pestaña 2 solo se carga cuando el usuario se desliza a la pestaña 2)

Aquí está el código de fragment mi padre

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

Y mi hijo fragmento de código. Quiero que estos códigos solo se ejecuten cada vez que el usuario se deslice a la pestaña secundaria. Cualquier ayuda es muy apreciada, gracias

@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);


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

puedes usar el método anterior dentro de tu fragmento que está dentro de tu Adapter ViewPager

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

tenga en cuenta que no inicialice las vistas allí ni nada, onViewCreated sus vistas dentro onViewCreated y llame al método que desea ejecutar en setUserVisibleHint . Otra forma fea es agregar un detector de desplazamiento a su ViewPager y obtener la posición actual del elemento y desencadenar una acción que esté dentro del fragmento. Para obtener el fragmento del Adapter ViewPager puedes hacer esto:

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

entonces podrías llamar a un método que está dentro de MyFragment