使用 RadioGroup 切换 ViewPager 视图
Using RadioGroup to switch ViewPager Views
我正在尝试使用 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;
}
}
};
我的寻呼机适配器
public class PagesAdapter 扩展了 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;
}
如有任何帮助,我们将不胜感激。谢谢
你有两个错误
- 您正在使用
onPageScrolled()
ViewPager.OnPageChangeListener
你应该使用
onPageSelected()
改为
- 您可以获得 Whosebug,因为当您更改视图寻呼机时,您将触发
RadioGroup.OnCheckedChangeListener
侦听器,反之亦然。
修复
将 ViewPager.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);
}
};
我正在尝试使用 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;
}
}
};
我的寻呼机适配器
public class PagesAdapter 扩展了 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;
}
如有任何帮助,我们将不胜感激。谢谢
你有两个错误
- 您正在使用
onPageScrolled()
ViewPager.OnPageChangeListener
你应该使用onPageSelected()
改为 - 您可以获得 Whosebug,因为当您更改视图寻呼机时,您将触发
RadioGroup.OnCheckedChangeListener
侦听器,反之亦然。
修复
将 ViewPager.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);
}
};