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