Search code examples
androidandroid-fragmentsandroid-viewpagerandroid-radiogroup

Using RadioGroup to switch ViewPager Views


I am trying to use RadioGroup to handle my ViewPager screen switches. But, the ViewPager just wouldn't scroll to the Position specified. I'm confused, wether I'm the one not doing something right. Below is my code

Pager Listener

 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            switch (position) {
                case 0:
                    switcherGroup.check(R.id.view1);
                    break;
                case 1:
                    switcherGroup.check(R.id.view2);
                    break;
                case 2:
                    switcherGroup.check(R.id.view3);
                    break;
                case 3:
                    switcherGroup.check(R.id.view4);
                    break;
                case 4:
                    switcherGroup.check(R.id.view5);
                    break;
                default:
                    break;
            }
        }

        @Override
        public void onPageSelected(int position) {
            //
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            //
        }
    });

The above works fine. But, when I add the RadioGroup CheckListener, that's where the problem is.

RagioGroup I added the if checks when pager.setCurrentItem(value, true) keeps making the screen just makes the screen switch randomly. Like it's not following instructions at all.

private final RadioGroup.OnCheckedChangeListener onCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup group, int checkedId) {
        switch (checkedId) {
            case R.id.loanView:
                if (pager.getCurrentItem() != 0) {
                    pager.setCurrentItem(0, true);
                }
                break;
            case R.id.loanProfileView:
                if (pager.getCurrentItem() != 1) {
                    pager.setCurrentItem(1, true);
                }
                break;
            case R.id.loanEmployeeView:
                if (pager.getCurrentItem() != 2) {
                    pager.setCurrentItem(2, true);
                }
                break;
            case R.id.loanHouseView:
                if (pager.getCurrentItem() != 3) {
                    pager.setCurrentItem(3, true);
                }
                break;
            case R.id.loanIncomeView:
                if (pager.getCurrentItem() != 4) {
                    pager.setCurrentItem(4, true);
                }
                break;
            default:
                break;
        }
    }
};

My Pager Adapter

public class PagersAdapter extends FragmentPagerAdapter {

public PagersAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    Fragment fragment = new Frag1();
    switch (position) {
        case 0:
            fragment = new Frag1();
            break;
        case 1:
            fragment = new Frag2();
            break;
        case 2:
            fragment = new Frag3();
            break;
        case 3:
            fragment = new Frag4();
            break;
        case 4:
            fragment = new Frag5();
    }
    return fragment;
}

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

Any help would be appreciated. Thanks


Solution

  • You have two bugs

    1. You are using the onPageScrolled() of the ViewPager.OnPageChangeListener and you should use onPageSelected() instead
    2. You can get stackoverflow because when you change the view pager you will trigger RadioGroup.OnCheckedChangeListener listener and vice-versa.

    Fix

    Initialize the ViewPager.OnPageChangeListener as a variable and use onPageSelected() instead.

    private final ViewPager.SimpleOnPageChangeListener simpleOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            super.onPageSelected(position);
            // Logic
        }
    };
    

    and unset the other listener on each listener and assign them back at the end of the function to not fire the listeners cyclic and get stackoverflows.

    private final RadioGroup.OnCheckedChangeListener onCheckedChangeListener = new RadioGroup.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(RadioGroup group, int checkedId) {
            pager.removeOnPageChangeListener(simpleOnPageChangeListener);
            // Logic
            pager.addOnPageChangeListener(simpleOnPageChangeListener);
        }
    };
    
    
    
    private final ViewPager.SimpleOnPageChangeListener simpleOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                radioGroup.setOnCheckedChangeListener(null);
                // Logic
                radioGroup.setOnCheckedChangeListener(onCheckedChangeListener);
            }
        };