java - how load fragment in ViewPager only when its selected

Java - how load fragment in ViewPager only when its selected

In Android using ViewPager with Fragments, the default behavior is to load adjacent fragments to ensure smooth scrolling and user experience. However, if you want to load a fragment only when it is selected (i.e., when it becomes the current visible fragment in the ViewPager), you can customize this behavior. Here's how you can achieve it:

Approach Using FragmentPagerAdapter

If you're using FragmentPagerAdapter, fragments are kept in memory by default to provide smooth swiping between pages. To load a fragment only when it becomes visible (selected), you need to handle fragment creation and destruction based on visibility.

  1. Customize FragmentPagerAdapter:

    Create a custom FragmentPagerAdapter where you override the getItem method to control when fragments are instantiated.

    import android.content.Context; import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentPagerAdapter; import java.util.ArrayList; import java.util.List; public class CustomPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragments = new ArrayList<>(); public CustomPagerAdapter(@NonNull FragmentManager fm, int behavior) { super(fm, behavior); } public void addFragment(Fragment fragment) { fragments.add(fragment); } @NonNull @Override public Fragment getItem(int position) { return fragments.get(position); } @Override public int getCount() { return fragments.size(); } @Override public CharSequence getPageTitle(int position) { // Return tab title if needed return "Fragment " + (position + 1); } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { // Override destroyItem to prevent fragment destruction // This is necessary for controlling when fragments are destroyed // super.destroyItem(container, position, object); // Comment out or remove this line } } 
  2. Override FragmentPagerAdapter's destroyItem Method:

    Override the destroyItem method in FragmentPagerAdapter to prevent destroying fragments when they are swiped out of view.

    @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { // Comment out or remove the super call to prevent destroying fragments // super.destroyItem(container, position, object); } 
  3. Load Fragment When Selected:

    In your FragmentPagerAdapter or ViewPager configuration, ensure fragments are loaded when selected:

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // Not used, but required for interface } @Override public void onPageSelected(int position) { // Load the fragment at position if needed // Example: If you want to load fragment only when selected // Fragment fragment = fragments.get(position); // Implement your logic to load fragment here } @Override public void onPageScrollStateChanged(int state) { // Not used, but required for interface } }); 

Notes:

  • Memory Management: Be cautious with this approach as it can lead to frequent fragment creation and destruction, impacting performance and user experience negatively.

  • Customization: Adjust the FragmentPagerAdapter methods (getItem, getCount, destroyItem, etc.) according to your specific requirements and fragment lifecycle management needs.

  • Alternative: Consider using FragmentStatePagerAdapter instead of FragmentPagerAdapter if you need to save memory by destroying fragments when they are not visible. FragmentStatePagerAdapter is suitable for handling a large number of fragments or heavy fragments.

By customizing FragmentPagerAdapter and handling fragment creation/destruction carefully, you can achieve the desired behavior of loading fragments only when they are selected in a ViewPager in your Android application. Adjust the implementation based on your specific use case and performance considerations.

Examples

  1. How to lazy load fragments in ViewPager in Java?

    Description: This query focuses on implementing lazy loading for fragments in a ViewPager, ensuring that fragments are loaded only when they are selected.

    // ViewPagerAdapter public class ViewPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList = new ArrayList<>(); private List<String> fragmentTitleList = new ArrayList<>(); public ViewPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } public void addFragment(Fragment fragment, String title) { fragmentList.add(fragment); fragmentTitleList.add(title); } @Override public CharSequence getPageTitle(int position) { return fragmentTitleList.get(position); } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); adapter.addFragment(new FirstFragment(), "First"); adapter.addFragment(new SecondFragment(), "Second"); viewPager.setAdapter(adapter); 
  2. How to implement ViewPager with lazy loading in Java?

    Description: This query covers the implementation of ViewPager with lazy loading, ensuring fragments are created only when selected.

    // FragmentStatePagerAdapter with lazy loading public class LazyPagerAdapter extends FragmentStatePagerAdapter { private SparseArray<Fragment> registeredFragments = new SparseArray<>(); public LazyPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new FirstFragment(); case 1: return new SecondFragment(); default: return null; } } @Override public int getCount() { return 2; // number of fragments } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); registeredFragments.put(position, (Fragment) object); } public Fragment getRegisteredFragment(int position) { return registeredFragments.get(position); } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); LazyPagerAdapter adapter = new LazyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); 
  3. How to use FragmentStatePagerAdapter for lazy loading in ViewPager in Java?

    Description: This query focuses on using FragmentStatePagerAdapter for lazy loading in ViewPager.

    // Lazy loading with FragmentStatePagerAdapter public class MyPagerAdapter extends FragmentStatePagerAdapter { public MyPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { if (position == 0) { return new FirstFragment(); } else if (position == 1) { return new SecondFragment(); } else { return new ThirdFragment(); } } @Override public int getCount() { return 3; } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); 
  4. How to load fragments only when selected in ViewPager in Java?

    Description: This query seeks to load fragments in a ViewPager only when they are selected by the user.

    // Custom FragmentPagerAdapter with lazy loading public class CustomPagerAdapter extends FragmentPagerAdapter { private Fragment[] fragments = new Fragment[3]; public CustomPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { if (fragments[position] == null) { if (position == 0) { fragments[position] = new FirstFragment(); } else if (position == 1) { fragments[position] = new SecondFragment(); } else { fragments[position] = new ThirdFragment(); } } return fragments[position]; } @Override public int getCount() { return 3; } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); CustomPagerAdapter adapter = new CustomPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); 
  5. How to avoid preloading of fragments in ViewPager in Java?

    Description: This query aims to prevent the preloading of fragments in a ViewPager, loading them only when they are selected.

    // Lazy loading fragments in ViewPager public class NoPreloadPagerAdapter extends FragmentStatePagerAdapter { public NoPreloadPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new FirstFragment(); case 1: return new SecondFragment(); default: return new ThirdFragment(); } } @Override public int getCount() { return 3; } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); NoPreloadPagerAdapter adapter = new NoPreloadPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); 
  6. How to dynamically load fragments in ViewPager in Java?

    Description: This query explores dynamically loading fragments in a ViewPager, ensuring they are loaded only when selected.

    // FragmentStatePagerAdapter with dynamic loading public class DynamicPagerAdapter extends FragmentStatePagerAdapter { public DynamicPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new FirstFragment(); case 1: return new SecondFragment(); default: return new ThirdFragment(); } } @Override public int getCount() { return 3; } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); DynamicPagerAdapter adapter = new DynamicPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); 
  7. How to implement ViewPager with FragmentStatePagerAdapter for lazy loading in Java?

    Description: This query focuses on implementing a ViewPager with FragmentStatePagerAdapter for lazy loading.

    // ViewPager with FragmentStatePagerAdapter public class LazyLoadingPagerAdapter extends FragmentStatePagerAdapter { public LazyLoadingPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { switch (position) { case 0: return new FirstFragment(); case 1: return new SecondFragment(); default: return new ThirdFragment(); } } @Override public int getCount() { return 3; } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); LazyLoadingPagerAdapter adapter = new LazyLoadingPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); 
  8. How to use FragmentPagerAdapter with lazy loading in ViewPager in Java?

    Description: This query addresses using FragmentPagerAdapter with lazy loading in a ViewPager.

    // FragmentPagerAdapter with lazy loading public class LazyLoadingFragmentPagerAdapter extends FragmentPagerAdapter { public LazyLoadingFragmentPagerAdapter(FragmentManager fm) { super(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); } @Override public Fragment getItem(int position) { if (position == 0) { return new FirstFragment(); } else if (position == 1) { return new SecondFragment(); } else { return new ThirdFragment(); } } @Override public int getCount() { return 3; } } // MainActivity ViewPager viewPager = findViewById(R.id.viewPager); LazyLoadingFragmentPagerAdapter adapter = new LazyLoadingFragmentPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); 

More Tags

selectionchanged http-status-code-415 file-manipulation angular-formbuilder dependency-injection openstack-nova qml react-test-renderer cpu figure

More Programming Questions

More Transportation Calculators

More Organic chemistry Calculators

More Mortgage and Real Estate Calculators

More Electrochemistry Calculators