Android菜鸟的成长笔记——RadioGroup + ViewPager 联动时,ViewPager滑动不流畅

利用RadioGroup做底部导航栏,实现与ViewPager的联动,实现思路如下:

首先,为ViewPager添加一个pageChangeListener,在onPageSelected中实现RadioButton的联动。

 mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
        {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
            {

            }

            @Override
            public void onPageSelected(int position)
            {
                mBottomBar.check(mRbId[position]);
            }

            @Override
            public void onPageScrollStateChanged(int state)
            {

            }
        });
    }
试一下效果,滑动viewPager后,会选中相应的RadioButton。

然后,为RadioGroup添加一个OnCheckChangeListener,实现点击相应的RaidoButton选择相应的Pager。

mBottomBar.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener()
        {
            @Override
            public void onCheckedChanged(RadioGroup group, int checkedId)
            {
                for (int i = 0; i < mRbId.length; i++)
                {
                    //获取RaidoButton对应页面的位置
                    if (mRbId[i] == checkedId)
                    {
                        mViewPager.setCurrentItem(i, false);
                        break;
                    }
                }

            }
        });
点击相应的RadioButton,会选中相应的页面。

不过,滑动起来,Page动作很快,和没加OnCheckChangeListener之前不是一个效果了。什么情况!

打了个Log试了一下,滑动过一个页面,onCheckedChanged调用了3次!这是神马情况!!!!!!!

看了一下源码:

public void check(@IdRes int id) {
        // don't even bother
        if (id != -1 && (id == mCheckedId)) {
            return;
        }

        if (mCheckedId != -1) {
            setCheckedStateForView(mCheckedId, false);
        }

        if (id != -1) {
            setCheckedStateForView(id, true);
        }

        setCheckedId(id);
    }

    private void setCheckedId(@IdRes int id) {
        mCheckedId = id;
        if (mOnCheckedChangeListener != null) {
            mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
        }
    }
先取消上一个的选中状态,在选择现在这个,最后调用onCheckedChanged,这只有一次啊?setCheckedStateForView里面调用了RadioButton的setChecked方法。在setChecked里面有这么一句:

notifyViewAccessibilityStateChangedIfNeeded(
                    AccessibilityEvent.CONTENT_CHANGE_TYPE_UNDEFINED);
这是什么鬼!谷歌对AccessibilityEvent 的解释如下:This class represents accessibility events that are sent by the system when something notable happens in the user interface. For example, when a  Button  is clicked, a  View  is focused, etc.

问题就出在这上面了!notifyViewAccessibilityStateChangedIfNeeded这个方法在View下面,它会把事件发送给上级视图。怪不得会调用3次!怎么解决呢?

http://stackoverflow.com/questions/32295984/using-radiogroup-to-switch-viewpager-views

在这找到了答案,改一下ViewPager 的监听。

@Override
                                               public void onPageSelected(int position)
                                               {
                                                   super.onPageSelected(position);
                                                   mBottomBar.setOnCheckedChangeListener(null);
                                                   mBottomBar.check(mRbId[position]);
                                                   mBottomBar.setOnCheckedChangeListener(MainActivity.this);
                                               }
把RadioGroup的Listener拿到activity中。

@Override
    public void onCheckedChanged(RadioGroup group, int checkedId)
    {
        for (int i = 0; i < mRbId.length; i++)
        {
            if (mRbId[i] == checkedId)
            {
                mViewPager.setCurrentItem(i);
            }
        }
    }
折腾了半天终于搞定了。菜鸟伤不起啊!






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值