From fd257a44034e7ac21f56ae1accc3c78a247e433c Mon Sep 17 00:00:00 2001 From: crazycodeboy Date: Tue, 29 May 2018 14:43:50 +0800 Subject: [PATCH] fix mContentOffsetY sometimes inaccurate --- .../plugin/weex/BindingXScrollHandler.java | 6 ++++- .../bindingx/plugin/weex/RecycleUtil.java | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/RecycleUtil.java diff --git a/weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/BindingXScrollHandler.java b/weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/BindingXScrollHandler.java index 483b2b18..5167d8f0 100644 --- a/weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/BindingXScrollHandler.java +++ b/weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/BindingXScrollHandler.java @@ -328,7 +328,11 @@ public void onScrolled(RecyclerView recyclerView, final int dx, final int dy) { // so you should bind it as early as possible if(ViewCompat.isInLayout(recyclerView) && mComponentRef != null && mComponentRef.get() != null) { - mContentOffsetY = Math.abs(mComponentRef.get().calcContentOffset(recyclerView)); + if (RecycleUtil.recyclerVerticalScrollOffset(recyclerView) != 0){ + mContentOffsetY = Math.abs(mComponentRef.get().calcContentOffset(recyclerView)); + } else { + mContentOffsetY = 0; + } } else { mContentOffsetY += dy; } diff --git a/weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/RecycleUtil.java b/weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/RecycleUtil.java new file mode 100644 index 00000000..cb122954 --- /dev/null +++ b/weex/android/bindingx_weex_plugin/src/main/java/com/alibaba/android/bindingx/plugin/weex/RecycleUtil.java @@ -0,0 +1,26 @@ +package com.alibaba.android.bindingx.plugin.weex; + +import android.support.annotation.NonNull; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; +import android.view.View; + +public class RecycleUtil { + public static int recyclerVerticalScrollOffset(@NonNull RecyclerView recyclerView) { + if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) { + LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager(); + int position = manager.findFirstVisibleItemPosition(); + View firstItemView = manager.findViewByPosition(position); + return firstItemView.getTop(); + } else if (recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) { + StaggeredGridLayoutManager manager = (StaggeredGridLayoutManager) recyclerView.getLayoutManager(); + int[] firstVisibleItems = manager.findFirstVisibleItemPositions(null); + if (firstVisibleItems.length > 0) { + View firstItemView = manager.findViewByPosition(firstVisibleItems[0]); + return firstItemView.getTop(); + } + } + return recyclerView.computeVerticalScrollOffset(); + } +}