【问题标题】:Sync scroll of horizontal recylerview with viewpager scroll将水平 recylerview 的滚动与 viewpager 滚动同步
【发布时间】:2018-06-27 11:35:25
【问题描述】:

我有一个带有一些值的视图寻呼机,回收器视图上方的回收器视图的计数相同(就像一个标签布局)

我已经使用 snap helper 实现了该功能,并且所有工作正常我想要的只是我想将 recyclerview 的滚动与 viewpager 滚动同步,这是我无法实现的。

以下是我想要达到的目标

但我得到的是如下所示

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

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

myRecyler..scrollBy(positionOffsetPixels,0);
}

但它的奇怪行为我也试过 scrollToPositionWithOffset

layoutManagerStart.scrollToPositionWithOffset(position,positionOffsetPixels);

但都失败了,我使用 snap helpers,所以所选项目将位于第一个位置。

谁能帮我实现上面那个效果。

【问题讨论】:

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


    【解决方案1】:

    我也有同样的问题,因为你没有提供正确的信息我添加了以下 sn-p

    您需要将 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 转到链接查看解决方案

    希望对你有帮助

    【讨论】:

    • 我会检查并让你知道@Ramz
    • 你也有和我一样的问题吗?
    • 是的,我还必须使用 viewpager 滚动我的回收器视图
    • 非常感谢您的工作!并感谢您与社区分享。你想出的想法太棒了!虽然代码有点乱,但没关系,我猜你很着急。再次感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2021-02-02
    相关资源
    最近更新 更多