From fcede26ac4bd296e39b786c879c4af7c84bac03e Mon Sep 17 00:00:00 2001 From: cgspine Date: Tue, 22 Dec 2020 17:47:43 +0800 Subject: [PATCH] use count for performance --- .../QMUIRVDraggableScrollBar.java | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/qmui/src/main/java/com/qmuiteam/qmui/recyclerView/QMUIRVDraggableScrollBar.java b/qmui/src/main/java/com/qmuiteam/qmui/recyclerView/QMUIRVDraggableScrollBar.java index 6f7bca20..2b7968db 100644 --- a/qmui/src/main/java/com/qmuiteam/qmui/recyclerView/QMUIRVDraggableScrollBar.java +++ b/qmui/src/main/java/com/qmuiteam/qmui/recyclerView/QMUIRVDraggableScrollBar.java @@ -27,6 +27,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.qmuiteam.qmui.R; @@ -44,6 +45,7 @@ public class QMUIRVDraggableScrollBar extends RecyclerView.ItemDecoration implem private int[] STATE_NORMAL = new int[]{}; private static final long DEFAULT_KEE_SHOW_DURATION = 800L; private static final long DEFAULT_TRANSITION_DURATION = 100L; + private static final int MIN_COUNT_FOR_PERCENT_CALCULATE = 1000; RecyclerView mRecyclerView; QMUIStickySectionLayout mStickySectionLayout; @@ -345,13 +347,19 @@ public class QMUIRVDraggableScrollBar extends RecyclerView.ItemDecoration implem recyclerView.scrollToPosition(adapter.getItemCount() - 1); } } else { - int range = getScrollRange(recyclerView); - int offset = getCurrentOffset(recyclerView); - int delta = (int) (range * mPercent - offset); - if (mIsVerticalScroll) { - recyclerView.scrollBy(0, delta); - } else { - recyclerView.scrollBy(delta, 0); + RecyclerView.Adapter adapter = recyclerView.getAdapter(); + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if(adapter != null && adapter.getItemCount() > MIN_COUNT_FOR_PERCENT_CALCULATE && layoutManager instanceof LinearLayoutManager){ + ((LinearLayoutManager)layoutManager).scrollToPositionWithOffset((int) (adapter.getItemCount() * mPercent), 0); + }else{ + int range = getScrollRange(recyclerView); + int offset = getCurrentOffset(recyclerView); + int delta = (int) (range * mPercent - offset); + if (mIsVerticalScroll) { + recyclerView.scrollBy(0, delta); + } else { + recyclerView.scrollBy(delta, 0); + } } } invalidate(); @@ -451,6 +459,12 @@ public class QMUIRVDraggableScrollBar extends RecyclerView.ItemDecoration implem } private float calculatePercent(@NonNull RecyclerView recyclerView) { + RecyclerView.Adapter adapter = recyclerView.getAdapter(); + RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); + if(adapter != null && adapter.getItemCount() > MIN_COUNT_FOR_PERCENT_CALCULATE && layoutManager instanceof LinearLayoutManager){ + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; + return linearLayoutManager.findFirstCompletelyVisibleItemPosition() * 1f / adapter.getItemCount(); + } return QMUILangHelper.constrain(getCurrentOffset(recyclerView) * 1f / getScrollRange(recyclerView), 0f, 1f); }