@@ -208,7 +208,7 @@ public float getInterpolation(float t) {
208
208
private boolean mCalledSuper ;
209
209
private int mDecorChildCount ;
210
210
211
- private OnPageChangeListener mOnPageChangeListener ;
211
+ private ArrayList < OnPageChangeListener > mOnPageChangeListeners = new ArrayList <>() ;
212
212
private OnPageChangeListener mInternalPageChangeListener ;
213
213
private OnAdapterChangeListener mAdapterChangeListener ;
214
214
private PageTransformer mPageTransformer ;
@@ -305,6 +305,21 @@ public void onPageScrollStateChanged(int state) {
305
305
}
306
306
}
307
307
308
+ private void triggerOnPageChangeEvent (int position ) {
309
+ for (OnPageChangeListener eachListener : mOnPageChangeListeners ) {
310
+ if (eachListener != null ) {
311
+ InfinitePagerAdapter infiniteAdapter = (InfinitePagerAdapter )mAdapter ;
312
+ if (infiniteAdapter .getRealCount () == 0 ) {
313
+ return ;
314
+ }
315
+ int n = position % infiniteAdapter .getRealCount ();
316
+ eachListener .onPageSelected (n );
317
+ }
318
+ }
319
+ if (mInternalPageChangeListener != null ) {
320
+ mInternalPageChangeListener .onPageSelected (position );
321
+ }
322
+ }
308
323
/**
309
324
* A PageTransformer is invoked whenever a visible/attached page is scrolled.
310
325
* This offers an opportunity for the application to apply a custom transformation
@@ -394,8 +409,10 @@ private void setScrollState(int newState) {
394
409
// PageTransformers can do complex things that benefit from hardware layers.
395
410
enableLayers (newState != SCROLL_STATE_IDLE );
396
411
}
397
- if (mOnPageChangeListener != null ) {
398
- mOnPageChangeListener .onPageScrollStateChanged (newState );
412
+ for (OnPageChangeListener eachListener : mOnPageChangeListeners ) {
413
+ if (eachListener != null ) {
414
+ eachListener .onPageScrollStateChanged (newState );
415
+ }
399
416
}
400
417
}
401
418
@@ -539,12 +556,7 @@ void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int
539
556
// We don't have any idea how big we are yet and shouldn't have any pages either.
540
557
// Just set things up and let the pending layout handle things.
541
558
mCurItem = item ;
542
- if (dispatchSelected && mOnPageChangeListener != null ) {
543
- mOnPageChangeListener .onPageSelected (item );
544
- }
545
- if (dispatchSelected && mInternalPageChangeListener != null ) {
546
- mInternalPageChangeListener .onPageSelected (item );
547
- }
559
+ triggerOnPageChangeEvent (item );
548
560
requestLayout ();
549
561
} else {
550
562
populate (item );
@@ -563,18 +575,12 @@ private void scrollToItem(int item, boolean smoothScroll, int velocity,
563
575
}
564
576
if (smoothScroll ) {
565
577
smoothScrollTo (destX , 0 , velocity );
566
- if (dispatchSelected && mOnPageChangeListener != null ) {
567
- mOnPageChangeListener .onPageSelected (item );
568
- }
569
- if (dispatchSelected && mInternalPageChangeListener != null ) {
570
- mInternalPageChangeListener .onPageSelected (item );
578
+ if (dispatchSelected ) {
579
+ triggerOnPageChangeEvent (item );
571
580
}
572
581
} else {
573
- if (dispatchSelected && mOnPageChangeListener != null ) {
574
- mOnPageChangeListener .onPageSelected (item );
575
- }
576
- if (dispatchSelected && mInternalPageChangeListener != null ) {
577
- mInternalPageChangeListener .onPageSelected (item );
582
+ if (dispatchSelected ) {
583
+ triggerOnPageChangeEvent (item );
578
584
}
579
585
completeScroll (false );
580
586
scrollTo (destX , 0 );
@@ -583,13 +589,25 @@ private void scrollToItem(int item, boolean smoothScroll, int velocity,
583
589
}
584
590
585
591
/**
586
- * Set a listener that will be invoked whenever the page changes or is incrementally
592
+ * Add a listener that will be invoked whenever the page changes or is incrementally
587
593
* scrolled. See {@link OnPageChangeListener}.
588
594
*
589
- * @param listener Listener to set
595
+ * @param listener Listener to add
596
+ */
597
+ public void addOnPageChangeListener (OnPageChangeListener listener ) {
598
+ if (!mOnPageChangeListeners .contains (listener )) {
599
+ mOnPageChangeListeners .add (listener );
600
+ }
601
+ }
602
+
603
+ /**
604
+ * Remove a listener that was added with addOnPageChangeListener
605
+ * See {@link OnPageChangeListener}.
606
+ *
607
+ * @param listener Listener to remove
590
608
*/
591
- public void setOnPageChangeListener (OnPageChangeListener listener ) {
592
- mOnPageChangeListener = listener ;
609
+ public void removeOnPageChangeListener (OnPageChangeListener listener ) {
610
+ mOnPageChangeListeners . remove ( listener ) ;
593
611
}
594
612
595
613
/**
@@ -1706,9 +1724,10 @@ protected void onPageScrolled(int position, float offset, int offsetPixels) {
1706
1724
}
1707
1725
}
1708
1726
}
1709
-
1710
- if (mOnPageChangeListener != null ) {
1711
- mOnPageChangeListener .onPageScrolled (position , offset , offsetPixels );
1727
+ for (OnPageChangeListener eachListener : mOnPageChangeListeners ) {
1728
+ if (eachListener != null ) {
1729
+ eachListener .onPageScrolled (position , offset , offsetPixels );
1730
+ }
1712
1731
}
1713
1732
if (mInternalPageChangeListener != null ) {
1714
1733
mInternalPageChangeListener .onPageScrolled (position , offset , offsetPixels );
0 commit comments