使用 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;
}

如有任何帮助,我们将不胜感激。谢谢

你有两个错误

  1. 您正在使用 onPageScrolled() ViewPager.OnPageChangeListener 你应该使用 onPageSelected() 改为
  2. 您可以获得 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);
        }
    };