【问题标题】:Using RadioGroup to switch ViewPager Views使用 RadioGroup 切换 ViewPager 视图
【发布时间】:2015-08-30 11:20:28
【问题描述】:

我正在尝试使用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;
        }
    }
};

我的寻呼机适配器

公共类 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;
}

任何帮助将不胜感激。谢谢

【问题讨论】:

  • 如果你得到随机页面,我猜问题出在你的 PagerAdapter 代码中。
  • @Raanan 我编辑了我的代码并添加了适配器。可以看看吗?
  • 解决了,如果没有 SO,我们该怎么办。 :)

标签: android android-fragments android-viewpager android-radiogroup


【解决方案1】:

你有两个错误

  1. 您正在使用onPageScrolled()ViewPager.OnPageChangeListener 你应该使用 改为onPageSelected()
  2. 您可以获得 stackoverflow,因为当您更改视图寻呼机时,您将触发 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);
        }
    };

【讨论】:

  • 好吧,你只是快速跟踪我今天的工作。介意高五吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多