Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 水平recylerview的同步滚动与viewpager滚动_Android_Android Layout_Android Recyclerview_Android Viewpager_Scrollview - Fatal编程技术网

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

Android 水平recylerview的同步滚动与viewpager滚动,android,android-layout,android-recyclerview,android-viewpager,scrollview,Android,Android Layout,Android Recyclerview,Android Viewpager,Scrollview,我有一个带有一些值的视图寻呼机,与recylerview上方的recycler视图的计数相同(就像一个表格布局) 我已经用snap helper实现了该功能,所有工作都很好。我唯一想要的是我想将recyclerview的滚动与viewpager滚动同步,这是我无法实现的 以下是我想要实现的目标 但我得到的是如下所示 我覆盖了查看页面的滚动,但没有任何用处 @Override public void onPageScrolled(int position, float pos

我有一个带有一些值的视图寻呼机,与recylerview上方的recycler视图的计数相同(就像一个表格布局)

我已经用snap helper实现了该功能,所有工作都很好。我唯一想要的是我想将recyclerview的滚动与viewpager滚动同步,这是我无法实现的

以下是我想要实现的目标

但我得到的是如下所示

我覆盖了查看页面的滚动,但没有任何用处

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

myRecyler..scrollBy(positionOffsetPixels,0);
}
但是它做出了奇怪的行为,我也尝试了使用偏移量滚动位置

layoutManagerStart.scrollToPositionWithOffset(position,positionOffsetPixels);
但是两个都失败了,我使用了捕捉帮助器,因此选定的项目将位于第一个位置


有谁能帮我达到上述效果。

我也有同样的问题,因为你没有提供正确的信息,我正在添加以下代码片段

您需要将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);
                       }
我已经做了一个样品,如果你想进一步验证,可以帮你 转到链接以查看解决方案


希望这能帮助你

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

您需要将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);
                       }
我已经做了一个样品,如果你想进一步验证,可以帮你 转到链接以查看解决方案


希望这将对您有所帮助

我会检查并让您知道@Ramzyou也有与我相同的问题?是的,我还必须用ViewPage滚动我的recyler视图谢谢您的工作!谢谢你与社区分享。你想出的主意太棒了!虽然代码有点乱,但没关系,我想你是赶时间。再次感谢:)我会检查并让你知道@Ramzyou也有和我一样的问题吗?是的,我还必须用ViewPage滚动我的recyler视图谢谢你的工作!谢谢你与社区分享。你想出的主意太棒了!虽然代码有点乱,但没关系,我想你是赶时间。再次感谢:)