小编典典

使用 RecyclerView + AppBarLayout

all

我正在使用带有 AppBarLayout 和 CollapsingToolbarLayout 的新 CoordinatorLayout。在
AppBarLayout 下方,我有一个带有内容列表的 RecyclerView。

当我向上和向下滚动列表时,我已验证在 RecyclerView 上滚动滚动有效。但是,我还希望 AppBarLayout 在扩展期间平滑滚动。

向上滚动以展开 CollaspingToolbarLayout 时,一旦手指离开屏幕,滚动就会立即停止。如果您快速向上滚动,有时
CollapsingToolbarLayout 也会重新折叠。RecyclerView 的这种行为似乎与使用 NestedScrollView
时的功能大不相同。

我试图在 recyclerview 上设置不同的滚动属性,但我无法弄清楚这一点。

这是一个显示 RecyclerView (CheeseDetailActivity) 问题的示例。
https://github.com/tylerjroach/cheesesquare

这是使用 Chris Banes 的 NestedScrollView 的原始示例。
https://github.com/chrisbanes/cheesesquare


阅读 74

收藏
2022-08-27

共1个答案

小编典典

主要问题是 RecyclerView 有时会给出不正确的投掷方向,因此如果您将以下代码添加到他的答案中,它可以正常工作:

public final class FlingBehavior extends AppBarLayout.Behavior {
    private static final int TOP_CHILD_FLING_THRESHOLD = 3;
    private boolean isPositive;

    public FlingBehavior() {
    }

    public FlingBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onNestedFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY, boolean consumed) {
        if (velocityY > 0 && !isPositive || velocityY < 0 && isPositive) {
            velocityY = velocityY * -1;
        }
        if (target instanceof RecyclerView && velocityY < 0) {
            final RecyclerView recyclerView = (RecyclerView) target;
            final View firstChild = recyclerView.getChildAt(0);
            final int childAdapterPosition = recyclerView.getChildAdapterPosition(firstChild);
            consumed = childAdapterPosition > TOP_CHILD_FLING_THRESHOLD;
        }
        return super.onNestedFling(coordinatorLayout, child, target, velocityX, velocityY, consumed);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        isPositive = dy > 0;
    }
}

我希望这个对你有用。

2022-08-27