Android 使用RadioGroup切换ViewPager视图

Android 使用RadioGroup切换ViewPager视图,android,android-fragments,android-viewpager,android-radiogroup,Android,Android Fragments,Android Viewpager,Android Radiogroup,我正在尝试使用RadioGroup来处理我的ViewPager屏幕切换。但是,ViewPager不会滚动到指定的位置。我很困惑,不管是不是我做的不对。下面是我的代码 寻呼机侦听器 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, i

我正在尝试使用
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我在
pager时添加了
if
检查。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;
        }
    }
};
我的寻呼机适配器

公共类PagerAdapter扩展了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

  • 您正在使用
    ViewPager.OnPageChangeListener
    您应该使用
    onPageSelected()
  • 您可以获得stackoverflow,因为当您更改视图寻呼机时,您将触发
    RadioGroup.OnCheckedChangeListener
    listener,反之亦然
  • 修理 将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);
            }
        };
    

    如果你得到的是随机页面,我猜问题出在你的PagerAdapter代码中。@Raanan我已经编辑了我的代码并添加了适配器。你能看一下吗?解决了,没有它我们该怎么办。:)好吧,你只是快速跟踪我今天的工作。介意击掌吗?