@@ -27,6 +27,18 @@ public class RecyclerViewFastScroller extends LinearLayout {
2727 private int height ;
2828 private boolean isInitialized = false ;
2929 private ObjectAnimator currentAnimator = null ;
30+
31+ private final RecyclerView .OnScrollListener onScrollListener = new RecyclerView .OnScrollListener () {
32+ @ Override
33+ public void onScrolled (final RecyclerView recyclerView , final int dx , final int dy ) {
34+ if (bubble == null || handle .isSelected ())
35+ return ;
36+ final int verticalScrollOffset = recyclerView .computeVerticalScrollOffset ();
37+ final int verticalScrollRange = recyclerView .computeVerticalScrollRange ();
38+ float proportion = (float ) verticalScrollOffset / ((float ) verticalScrollRange - height );
39+ setBubbleAndHandlePosition (height * proportion );
40+ }
41+ };
3042
3143 public interface BubbleTextGetter {
3244 String getTextToShowInBubble (int pos );
@@ -96,20 +108,28 @@ public boolean onTouchEvent(@NonNull MotionEvent event) {
96108 return super .onTouchEvent (event );
97109 }
98110
99- public void setRecyclerView (RecyclerView recyclerView ) {
111+ public void setRecyclerView (final RecyclerView recyclerView ) {
100112 this .recyclerView = recyclerView ;
101- RecyclerView .OnScrollListener onScrollListener = new RecyclerView .OnScrollListener () {
113+ recyclerView .addOnScrollListener (onScrollListener );
114+ recyclerView .getViewTreeObserver ().addOnPreDrawListener (new OnPreDrawListener () {
102115 @ Override
103- public void onScrolled (final RecyclerView recyclerView , final int dx , final int dy ) {
116+ public boolean onPreDraw () {
117+ recyclerView .getViewTreeObserver ().removeOnPreDrawListener (this );
104118 if (bubble == null || handle .isSelected ())
105- return ;
119+ return true ;
106120 final int verticalScrollOffset = recyclerView .computeVerticalScrollOffset ();
107121 final int verticalScrollRange = recyclerView .computeVerticalScrollRange ();
108122 float proportion = (float ) verticalScrollOffset / ((float ) verticalScrollRange - height );
109123 setBubbleAndHandlePosition (height * proportion );
124+ return true ;
110125 }
111- };
112- recyclerView .addOnScrollListener (onScrollListener );
126+ });
127+ }
128+
129+ @ Override
130+ protected void onDetachedFromWindow () {
131+ super .onDetachedFromWindow ();
132+ recyclerView .removeOnScrollListener (onScrollListener );
113133 }
114134
115135 private void setRecyclerViewPosition (float y ) {
0 commit comments