我正试图使用RadioGroup
来处理我的ViewPager
屏幕开关。但是,ViewPager
只是不会滚动到指定的位置。我很困惑,是不是我做错了什么。下面是我的代码
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) {
//
}
});
以上工作正常。但是,当我添加RadioGroup CheckListener时,这就是问题所在。
RagioGroup我添加了if
检查,当pager.setCurrentItem(value, true)
一直使屏幕只是使屏幕随机切换。就好像它根本没有按照指示操作。
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
公共类PagersAdapter扩展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;
}
任何帮助都会很感激。由于
你有两个bug
- 您正在使用的
onPageScrolled()
ViewPager.OnPageChangeListener
和你应该使用onPageSelected()
而不是 - 你可以得到stackoverflow,因为当你改变视图页,你会触发
RadioGroup.OnCheckedChangeListener
监听器,反之亦然。
初始化viewpage。OnPageChangeListener作为变量,并使用onPageSelected()
代替。
private final ViewPager.SimpleOnPageChangeListener simpleOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
// Logic
}
};
并取消每个侦听器上的其他侦听器的设置,并在函数结束时将它们赋值,以避免触发侦听器循环并导致堆栈溢出。
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);
}
};