From 8fb9a89ae4d39e88c605aa7e571c9dccb4d73a98 Mon Sep 17 00:00:00 2001 From: PhpXp Date: Sun, 8 May 2016 00:35:15 +0200 Subject: [PATCH] Fix choppy AppBar collapsing with RecyclerView (fixed) computeVerticalScrollOffset doesn't return accurate values - they can jump by 30px or more if all items don't have the same height. If possible, get the first ViewHolder and get it's top position and use it as the scroll offset. This time with better indentation. --- .../base/ObservableRecyclerView.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/smooth-app-bar-layout/src/main/java/me/henrytao/smoothappbarlayout/base/ObservableRecyclerView.java b/smooth-app-bar-layout/src/main/java/me/henrytao/smoothappbarlayout/base/ObservableRecyclerView.java index db55dc9..b7564f0 100644 --- a/smooth-app-bar-layout/src/main/java/me/henrytao/smoothappbarlayout/base/ObservableRecyclerView.java +++ b/smooth-app-bar-layout/src/main/java/me/henrytao/smoothappbarlayout/base/ObservableRecyclerView.java @@ -62,8 +62,22 @@ private void init() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { if (mOnScrollListener != null) { + final int verticalScrollOffset; + + RecyclerView.LayoutManager manager = mRecyclerView.getLayoutManager(); + if (manager instanceof LinearLayoutManager) { + RecyclerView.ViewHolder viewHolder = mRecyclerView.findViewHolderForAdapterPosition(0); + if (viewHolder != null) { + verticalScrollOffset = mRecyclerView.getPaddingTop() - viewHolder.itemView.getTop(); + } else { + verticalScrollOffset = recyclerView.computeVerticalScrollOffset(); + } + } else { + verticalScrollOffset = recyclerView.computeVerticalScrollOffset(); + } + mOnScrollListener.onScrollChanged(recyclerView, - recyclerView.computeHorizontalScrollOffset(), recyclerView.computeVerticalScrollOffset(), + recyclerView.computeHorizontalScrollOffset(), verticalScrollOffset, dx, dy, recyclerView.getLayoutManager().findViewByPosition(HEADER_VIEW_POSITION) != null); }