我正在尝试同步两个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,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; } } };
如果任一个手动滚动,另一个则使用scroll state属性从属于它.它的工作很好,直到物品达到最后的位置;在这一点上,从来的寻呼机立即弹回到先前选择的项目,就像滚动没有发生.
我尝试使用各种不同的逻辑约束调用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 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); } } });