TabLayout snippet only loads when user slide Android

Hi, I am creating an application with A fragment and several child fragment inside it using tablayout and viewpager . The problem is that all my fragment children (from tablayout ) are always executed (they load all the code inside whenever the user clicks on the parent fragment ). How to get the fragment child only when the user loads (for example, for example, I have 2 tabs, the contents in tab 2 are only loaded when the user goes to tab 2)

Here is my parent fragment code

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

And my fragment fragment. I want this code to be executed only when the user slides into the child tab. Any help is much appreciated, thanks

 @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); 
+5
source share
2 answers
 @Override public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); } 

you can use the above method in your fragment, which is inside your ViewPager Adapter

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

remember not to initialize the views there or anything else, run your views in onViewCreated and call the method you want to execute on setUserVisibleHint . Another ugly way is to add a scroll listener to your ViewPager and get the current position of the position and trigger an action that is inside the fragment. to get the snippet from the ViewPager Adapter you can do the following:

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

then you can call the method that is inside MyFragment

+4
source

By default, the Viewpager loads the adjacent fragment to ensure a smooth application, so when the user scrolls through the fragments (already loaded), it is. To change the default behavior, use viewpager.setOffscreenPageLimit(int limit) , where the limit is the number of fragments next to the one you are on, will be preloaded. Hope this helps

+1
source

Source: https://habr.com/ru/post/1239323/


All Articles