您的位置:首页 > 移动开发 > Android开发

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

2016-03-20 19:09 591 查看
利用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);
}
}
}
折腾了半天终于搞定了。菜鸟伤不起啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: