0

actually i have 4 fragments in my app and i switch the fragments by swiping left or right. I used view pager for swiping the fragments are swiping perfectly but there is a problem if i swipe and fragment B shows but the backend functionality of fragment C runs. If i go to C then backend functionality of D runs. At fragment A first backend functionality of fragment A runs then it automatically shifted to fragment B but front end view is of fragment A

This is adapter

public class TabsPagerAdapter extends FragmentPagerAdapter {

    private int mNumTabs;

    public TabsPagerAdapter(FragmentManager fm, int numTabs) {
        super(fm);
        this.mNumTabs= numTabs;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {

            case 0:
                PersonalSettings tab0 = new PersonalSettings();

                return tab0;
            case 1:
                Health tab1 = new Health();
                return tab1;
            case 2:
                Statistics tab2 = new Statistics();
                return tab2;
             case 3:
                Motivation tab3 = new Motivation();
                return tab3;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumTabs;
    }

}

This is main activity

  viewPager = (ViewPager) findViewById(R.id.pager);
        mAdapter = new TabsPagerAdapter(getSupportFragmentManager(),4);
        viewPager.setAdapter(mAdapter);
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });
    }

If u want further code i will give u

2 Answers2

0

It because the viewpager will preload the item next to the current item to improve UX (in your case, the item is the fragment)
You can set offscreenPageLimit to ViewPager to limit it:

viewPager.setOffscreenPageLimit(1);

But if you do this, you will found the fragment will reload everytime you enter, IMO this is not a good practice.

Library545
  • 161
  • 3
  • My bad, the default&min value of offscreenPageLimit is 1, which means there is 1 offscreen at least. If you really hate the preload, you should try navigation+fragment, it doesn't support swipe basically but it won't preload – Library545 Dec 25 '19 at 08:38
0

Override destroyItem method in FragmentpagerAdapter

 @Override
 public void destroyItem(ViewGroup container, int position, Object object) {
   // remove your fragment obj from here
 }
Ashwin Nirmale
  • 324
  • 2
  • 13