Синхронизировать прокрутку горизонтального recylerview с прокруткой viewpager - PullRequest
0 голосов
/ 27 июня 2018

У меня есть пейджер с некоторыми значениями, такое же количество для представления переработчика над обзором recyler (Действуйте как табуляция)

Я добился этой функции с помощью Snap Helper, и все работает нормально. Единственное, что мне нужно, - это я хочу синхронизировать прокрутку в окне реселлера с прокруткой в ​​окне просмотра, что я не могу достичь.

Ниже я хочу достичь

Но то, что я получаю, похоже ниже

Я переопределяю прокрутку страницы просмотра, но не пользуюсь

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

myRecyler..scrollBy(positionOffsetPixels,0);
}

Но это делает странное поведение, я также попробовал scrollToPositionWithOffset

layoutManagerStart.scrollToPositionWithOffset(position,positionOffsetPixels);

но оба не удалось, я использую помощник привязки, так что выбранный элемент будет на первой позиции.

Может ли кто-нибудь помочь мне добиться эффекта, подобного описанному выше.

1 Ответ

0 голосов
/ 11 июля 2018

У меня также была та же проблема, что и у вас, если вы не предоставили нужную информацию, добавляю следующий фрагмент

Вам нужно передать смещение позиции viewpager в функцию, как вы сказали, 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;

}

Добавьте вышеуказанный меторд к себе. AddOnPageChangeListener viewpager

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

Я сделал образец, который поможет вам, если вы хотите дополнительную проверку RecyclerParallelViewPager перейдите по ссылке, чтобы увидеть решение

gif

Надеюсь, это поможет вам

...