gpt4 book ai didi

android - 使用 OnPageChangeListener 同步两个 ViewPagers

转载 作者:可可西里 更新时间:2023-11-01 19:12:41 28 4
gpt4 key购买 nike

我正在尝试同步两个 ViewPager,因为在我之前显然有很多人,我已经做到了这一点:

private ViewPager mNavPager;

private ViewPager mMainPager;

private final OnPageChangeListener mNavPagerListener = new OnPageChangeListener() {

private boolean mNavDragging;
private int mScrollPosition;

@Override
public void onPageSelected(int position) {
mScrollPosition = position;
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(mNavDragging)
mMainPager.scrollTo(positionOffsetPixels, 0);
}

@Override
public void onPageScrollStateChanged(int state) {
switch(state) {
case ViewPager.SCROLL_STATE_DRAGGING:
case ViewPager.SCROLL_STATE_SETTLING:
mNavDragging = true;
break;
case ViewPager.SCROLL_STATE_IDLE:
mNavDragging = false;
break;
}
}
};

private OnPageChangeListener mMainPagerListener = new OnPageChangeListener() {

private boolean mMainDragging;
private int mScrollPosition;

@Override
public void onPageSelected(int position) {
mScrollPosition = position;
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if(mMainDragging)
mNavPager.scrollTo(positionOffsetPixels, 0);
}

@Override
public void onPageScrollStateChanged(int state) {
switch(state) {
case ViewPager.SCROLL_STATE_DRAGGING:
case ViewPager.SCROLL_STATE_SETTLING:
mMainDragging = true;
break;
case ViewPager.SCROLL_STATE_IDLE:
mMainDragging = false;
break;
}
}
};

如果其中一个是手动滚动的,则另一个将使用滚动状态属性从属于它。在元素到达最终位置之前,它会很好地工作;此时,从属寻呼机立即弹回到先前选择的项目,就好像滚动没有发生一样。

我试过使用各种不同的逻辑约束调用 ViewPager#setCurrentItem(mScrolledPosition) 但这也不起作用,尽管它偶尔会使情况变得更糟。我觉得好像一定有​​什么可以用它做的,但我不确定是什么。

如何让从属寻呼机保持在正确的位置?

最佳答案

我使用 OnPageChangeListener 以更简单(更清晰)的方式解决了这个问题:

mViewPager1.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

private int mScrollState = ViewPager.SCROLL_STATE_IDLE;

@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
return;
}
mViewPager2.scrollTo(mViewPager1.getScrollX(), mViewPager2.getScrollY());
}

@Override
public void onPageSelected(final int position) {

}

@Override
public void onPageScrollStateChanged(final int state) {
mScrollState = state;
if (state == ViewPager.SCROLL_STATE_IDLE) {
mViewPager2.setCurrentItem(mViewPager1.getCurrentItem(), false);
}
}
});

mViewPager2.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

private int mScrollState = ViewPager.SCROLL_STATE_IDLE;

@Override
public void onPageScrolled(final int position, final float positionOffset, final int positionOffsetPixels) {
if (mScrollState == ViewPager.SCROLL_STATE_IDLE) {
return;
}
mViewPager1.scrollTo(mViewPager2.getScrollX(), mViewPager1.getScrollY());
}

@Override
public void onPageSelected(final int position) {

}

@Override
public void onPageScrollStateChanged(final int state) {
mScrollState = state;
if (state == ViewPager.SCROLL_STATE_IDLE) {
mViewPager1.setCurrentItem(mViewPager2.getCurrentItem(), false);
}
}
});

关于android - 使用 OnPageChangeListener 同步两个 ViewPagers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107016/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com