onNestedScroll не дает dy, когда вертикальная прокрутка была инициирована касанием горизонтальной прокрутки потомка, а затем вертикальной прокруткой - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть макет координатора, который содержит представление вертикального переработчика горизонтальных представлений переработчика.

Я определил CoordinatorLayout.Behavior, который использует onNestedScroll для выполнения некоторых операций с моими представлениями на основе dyConsumed.

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

Иногда это работает, если вы бросаете в конце прокрутки.

Не работает, если вы касаетесь горизонтального вида переработчика и затем прокручиваете вертикально.

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

Я пытался изменить поведение, чтобы дать мне столько, сколько смогучтобы получить его, мне нужно, чтобы onStartNestedScroll всегда возвращал true и перемещал мой код обработки в onNestedPreScroll.Таким образом, теперь я получаю обновления dy для движения по вертикали их пальца при прокрутке по горизонтали в дочернем рециркуляторе.Но я все еще не получаю краситель для прокрутки по вертикали, если касание началось на горизонтальном рециркуляторе.

Что мне нужно сделать, чтобы получить все прокрутки по вертикали независимо от того, где касание было инициировано?

Настройка поведения для макета ограничения, который содержит все (и содержится в макете координатора)

CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) ((ConstraintLayout) toolbar.getParent()).getLayoutParams();
layoutParams.setBehavior(scrollBehavior);

Выдержка из пользовательского поведения

@Override
public boolean onStartNestedScroll(@NonNull CoordinatorLayout coordinatorLayout, @NonNull V child, @NonNull View directTargetChild, @NonNull View target, int axes, int type) {
    return axes == ViewCompat.SCROLL_AXIS_VERTICAL;
}
@Override
public void onNestedScroll(@NonNull CoordinatorLayout coordinatorLayout,
                           @NonNull V child,
                           @NonNull View target,
                           int dxConsumed,
                           int dyConsumed,
                           int dxUnconsumed,
                           int dyUnconsumed,
                           int type) {

    if (dyConsumed > 0) {
        //stuff
    } else if (dyConsumed < 0) {
        //other stuff
    }
}

Мой вертикальный переработчик

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/bucket_list"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:clipToPadding="false"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

Мой горизонтальный ресайклер

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/store_list"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingEnd="32dp"
    android:paddingRight="32dp"
    android:clipToPadding="false"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />

1 Ответ

0 голосов
/ 15 февраля 2019

Неожиданным решением было отключить вложенную прокрутку на горизонтальных рециркуляторах с помощью android: nestedScrollingEnabled = "false"

...