--- ./support/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/FastScroller.java 2020-03-23 17:03:46.092122318 +0100 +++ ./email/app/src/main/java/androidx/recyclerview/widget/FastScrollerEx.java 2020-04-24 21:08:55.544011257 +0200 @@ -37,8 +37,8 @@ import java.lang.annotation.RetentionPol /** * Class responsible to animate and provide a fast scroller. */ -@VisibleForTesting -class FastScroller extends RecyclerView.ItemDecoration implements RecyclerView.OnItemTouchListener { +//@VisibleForTesting +public class FastScrollerEx extends RecyclerView.ItemDecoration implements RecyclerView.OnItemTouchListener { @IntDef({STATE_HIDDEN, STATE_VISIBLE, STATE_DRAGGING}) @Retention(RetentionPolicy.SOURCE) private @interface State { } @@ -135,7 +135,7 @@ class FastScroller extends RecyclerView. } }; - FastScroller(RecyclerView recyclerView, StateListDrawable verticalThumbDrawable, + public FastScrollerEx(RecyclerView recyclerView, StateListDrawable verticalThumbDrawable, Drawable verticalTrackDrawable, StateListDrawable horizontalThumbDrawable, Drawable horizontalTrackDrawable, int defaultWidth, int scrollbarMinimumRange, int margin) { @@ -359,6 +359,7 @@ class FastScroller extends RecyclerView. (int) ((verticalVisibleLength * middleScreenPos) / verticalContentLength); mVerticalThumbHeight = Math.min(verticalVisibleLength, (verticalVisibleLength * verticalVisibleLength) / verticalContentLength); + mVerticalThumbHeight = Math.max(mVerticalThumbHeight, mVerticalThumbDrawable.getIntrinsicHeight()); } if (mNeedHorizontalScrollbar) { @@ -448,12 +449,24 @@ class FastScroller extends RecyclerView. if (Math.abs(mVerticalThumbCenterY - y) < 2) { return; } - int scrollingBy = scrollTo(mVerticalDragY, y, scrollbarRange, - mRecyclerView.computeVerticalScrollRange(), - mRecyclerView.computeVerticalScrollOffset(), mRecyclerViewHeight); - if (scrollingBy != 0) { - mRecyclerView.scrollBy(0, scrollingBy); + + androidx.recyclerview.widget.RecyclerView.Adapter adapter = mRecyclerView.getAdapter(); + int count = (adapter == null ? 0 : adapter.getItemCount()); + if (count == 1) { + int scrollingBy = scrollTo(mVerticalDragY, y, scrollbarRange, + mRecyclerView.computeVerticalScrollRange(), + mRecyclerView.computeVerticalScrollOffset(), mRecyclerViewHeight); + if (scrollingBy != 0) { + mRecyclerView.scrollBy(0, scrollingBy); + } } + else { + int scrollbarLength = scrollbarRange[1] - scrollbarRange[0]; + float percentage = (scrollbarLength == 0 ? 0 : y / (float) scrollbarLength); + int pos = Math.round(count * percentage); + mRecyclerView.scrollToPosition(pos); + } + mVerticalDragY = y; } @@ -494,7 +507,7 @@ class FastScroller extends RecyclerView. @VisibleForTesting boolean isPointInsideVerticalThumb(float x, float y) { return (isLayoutRTL() ? x <= mVerticalThumbWidth - : x >= mRecyclerViewWidth - mVerticalThumbWidth) + : x >= mRecyclerViewWidth - mVerticalThumbWidth * 3) && y >= mVerticalThumbCenterY - mVerticalThumbHeight / 2 && y <= mVerticalThumbCenterY + mVerticalThumbHeight / 2; }