将水平recylerview的滚动与viewpager滚动同步

时间:2018-06-27 11:35:26

标签: android android-layout android-recyclerview android-viewpager scrollview

我有一个视图分页器,其中包含一些值,在recylerview上方的回收器视图中具有相同的计数(就像一个分页器一样)

我已经使用snap helper实现了该功能,所有我想做的唯一正常的事情就是我想将recyclerview的滚动与viewpager滚动同步,而我无法实现。

以下是我要实现的目标

但是我得到的就像下面的

我覆盖了视图页面的滚动条,但没有用

 @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

myRecyler..scrollBy(positionOffsetPixels,0);
}

但是它令人奇怪的行为我也尝试了 scrollToPositionWithOffset

layoutManagerStart.scrollToPositionWithOffset(position,positionOffsetPixels);

但都失败了,我使用了快捷帮助器,因此所选项目将位于第一个位置。

任何人都可以帮助我达到上述效果。

1 个答案:

答案 0 :(得分:4)

我也遇到了同样的问题,因为您没有在添加以下代码段时提供正确的信息

您需要将viewpager的positionoffset传递给该函数,因为您说scrollToPositionWithOffset是正确的方法,但是在此之前您需要做一些计算。

检查以下代码

protected void scrollToTab(int position, float positionOffset) {
    int scrollOffset = 0;

    if (mItemWidth == 1 && yourrecylerview != null) {
        View child = yourrecylerview.getChildAt(0);
        if (child != null) {
            mItemWidth = child.getMeasuredWidth() * 2;
        }
    }

    View selectedView = yourlayoutmanager.findViewByPosition(position);
    View nextView = yourlayoutmanager.findViewByPosition(position + 1);

    if (nextView != null) {
        if (selectedView != null) {
            int width = yourrecylerview.getMeasuredWidth();
            float sLeft = (position == 0) ? 24 : width / mItemWidth - selectedView.getMeasuredWidth() / mItemWidth; // left edge of selected tab
            float sRight = sLeft + selectedView.getMeasuredWidth(); // right edge of selected tab
            float nLeft = width / mItemWidth - nextView.getMeasuredWidth() / mItemWidth; // left edge of next tab
            float distance = sRight - nLeft; // total distance that is needed to distance to next tab
            float dx = distance * positionOffset;
            scrollOffset = (int) (sLeft - dx);
        } else {
            scrollOffset = (mItemWidth/2) * (-1);
            //mRequestScrollToTab = true;
        }

        if (position != 0) {
            // scrollOffset=scrollOffset-10;
        }

        mIndicatorPosition = position;
        yourrecylerview.stopScroll();

        if ((position != mOldPosition || scrollOffset != mOldScrollOffset)) {

            yourlayoutmanager.scrollToPositionWithOffset(position, scrollOffset);

        } 

    }
    else
    {
        //Sometimes view go null for handling that situvation
        yourrecylerview.scrollToPosition(position);
        yourviewpager.setCurrentItem(position);
    }

    mOldPosition = position;
    mOldScrollOffset = scrollOffset;
    mOldPositionOffset=positionOffset;

}

在viewpager的addOnPageChangeListener上添加上述方法

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                     scrollToTab(position, positionOffset);
                       }

我制作了一个样本,可以帮助您进一步验证 RecyclerParallelViewPager 转到链接以查看解决方案

gif

希望这对您有帮助