@@ -27,6 +27,18 @@ public class RecyclerViewFastScroller extends LinearLayout {
27
27
private int height ;
28
28
private boolean isInitialized = false ;
29
29
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
+ };
30
42
31
43
public interface BubbleTextGetter {
32
44
String getTextToShowInBubble (int pos );
@@ -96,20 +108,28 @@ public boolean onTouchEvent(@NonNull MotionEvent event) {
96
108
return super .onTouchEvent (event );
97
109
}
98
110
99
- public void setRecyclerView (RecyclerView recyclerView ) {
111
+ public void setRecyclerView (final RecyclerView recyclerView ) {
100
112
this .recyclerView = recyclerView ;
101
- RecyclerView .OnScrollListener onScrollListener = new RecyclerView .OnScrollListener () {
113
+ recyclerView .addOnScrollListener (onScrollListener );
114
+ recyclerView .getViewTreeObserver ().addOnPreDrawListener (new OnPreDrawListener () {
102
115
@ Override
103
- public void onScrolled (final RecyclerView recyclerView , final int dx , final int dy ) {
116
+ public boolean onPreDraw () {
117
+ recyclerView .getViewTreeObserver ().removeOnPreDrawListener (this );
104
118
if (bubble == null || handle .isSelected ())
105
- return ;
119
+ return true ;
106
120
final int verticalScrollOffset = recyclerView .computeVerticalScrollOffset ();
107
121
final int verticalScrollRange = recyclerView .computeVerticalScrollRange ();
108
122
float proportion = (float ) verticalScrollOffset / ((float ) verticalScrollRange - height );
109
123
setBubbleAndHandlePosition (height * proportion );
124
+ return true ;
110
125
}
111
- };
112
- recyclerView .addOnScrollListener (onScrollListener );
126
+ });
127
+ }
128
+
129
+ @ Override
130
+ protected void onDetachedFromWindow () {
131
+ super .onDetachedFromWindow ();
132
+ recyclerView .removeOnScrollListener (onScrollListener );
113
133
}
114
134
115
135
private void setRecyclerViewPosition (float y ) {
0 commit comments