使用RadioGroup切换ViewPager视图



我正试图使用RadioGroup来处理我的ViewPager屏幕开关。但是,ViewPager只是不会滚动到指定的位置。我很困惑,是不是我做错了什么。下面是我的代码

<<p> 寻呼机侦听器/strong>
 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

  1. 您正在使用的onPageScrolled()ViewPager.OnPageChangeListener和你应该使用onPageSelected()而不是
  2. 你可以得到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);
        }
    };

最新更新