通过触摸水平滚动子级然后垂直滚动来启动垂直滚动时,onNestedScroll没有显示dy

时间:2019-02-15 13:32:07

标签: android android-recyclerview android-coordinatorlayout

我有一个协调器布局,其中包含水平回收器视图的垂直回收器视图。

我已经定义了一个CoordinatorLayout.Behavior,它使用dyConsumed来使用onNestedScroll对我的视图做一些事情。

如果您通过触摸水平回收站视图之外的任何位置进行滚动,然后垂直滚动,则可以使用。

如果您滚动滚动的末尾有时会起作用。

如果您触摸水平的回收站视图然后垂直滚动,则此操作无效。

它通常具有非常不一致的行为。就像,有时它不在乎您从何处开始滚动,直到其中一个卧式回收机被滚动,然后它将再次停止工作。

我尝试通过将onStartNestedScroll始终返回true并将处理代码移至onNestedPreScroll来更改行为,以尽我所能。这样,当我在儿童回收站中水平滚动时,我现在得到他们手指的垂直运动的动态更新。但是,如果在水平回收站上开始触摸,我仍然不会因为垂直滚动而烦恼。

无论从何处开始触摸,我都应该怎么做才能获得所有垂直滚动显示?

设置约束布局的行为,约束约束包含所有内容(并由协调器布局包含)

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 :(得分:0)

从直觉上讲,解决方案是使用android:nestedScrollingEnabled =“ false”

禁用水平回收站上的嵌套滚动