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
You have two bugs
onPageScrolled()
of the
ViewPager.OnPageChangeListener
and you should use
onPageSelected()
insteadRadioGroup.OnCheckedChangeListener
listener and vice-versa.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);
}
};