Skip to content

Commit 28bf41e

Browse files
committed
Merge pull request #100 from massimobio/master
Added a OnPageChangeListener to the SliderLayout
2 parents d156dd2 + 2e890ec commit 28bf41e

File tree

4 files changed

+74
-32
lines changed

4 files changed

+74
-32
lines changed

demo/src/main/java/com/daimajia/slider/demo/MainActivity.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.net.Uri;
55
import android.os.Bundle;
66
import android.support.v7.app.ActionBarActivity;
7+
import android.util.Log;
78
import android.view.Menu;
89
import android.view.MenuInflater;
910
import android.view.MenuItem;
@@ -18,11 +19,12 @@
1819
import com.daimajia.slider.library.SliderLayout;
1920
import com.daimajia.slider.library.SliderTypes.BaseSliderView;
2021
import com.daimajia.slider.library.SliderTypes.TextSliderView;
22+
import com.daimajia.slider.library.Tricks.ViewPagerEx;
2123

2224
import java.util.HashMap;
2325

2426

25-
public class MainActivity extends ActionBarActivity implements BaseSliderView.OnSliderClickListener{
27+
public class MainActivity extends ActionBarActivity implements BaseSliderView.OnSliderClickListener, ViewPagerEx.OnPageChangeListener{
2628

2729
private SliderLayout mDemoSlider;
2830

@@ -54,8 +56,8 @@ protected void onCreate(Bundle savedInstanceState) {
5456
.setOnSliderClickListener(this);
5557

5658
//add your extra information
57-
if (textSliderView.getBundle() != null)
58-
textSliderView.getBundle()
59+
textSliderView.bundle(new Bundle());
60+
textSliderView.getBundle()
5961
.putString("extra",name);
6062

6163
mDemoSlider.addSlider(textSliderView);
@@ -64,6 +66,7 @@ protected void onCreate(Bundle savedInstanceState) {
6466
mDemoSlider.setPresetIndicator(SliderLayout.PresetIndicators.Center_Bottom);
6567
mDemoSlider.setCustomAnimation(new DescriptionAnimation());
6668
mDemoSlider.setDuration(4000);
69+
mDemoSlider.addOnPageChangeListener(this);
6770
ListView l = (ListView)findViewById(R.id.transformers);
6871
l.setAdapter(new TransformerAdapter(this));
6972
l.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@@ -109,4 +112,15 @@ public boolean onOptionsItemSelected(MenuItem item) {
109112
}
110113
return super.onOptionsItemSelected(item);
111114
}
115+
116+
@Override
117+
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
118+
119+
@Override
120+
public void onPageSelected(int position) {
121+
Log.d("Slider Demo", "Page Changed: " + position);
122+
}
123+
124+
@Override
125+
public void onPageScrollStateChanged(int state) {}
112126
}

library/src/main/java/com/daimajia/slider/library/Indicators/PagerIndicator.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ public void setViewPager(ViewPagerEx pager){
328328
throw new IllegalStateException("Viewpager does not have adapter instance");
329329
}
330330
mPager = pager;
331-
mPager.setOnPageChangeListener(this);
331+
mPager.addOnPageChangeListener(this);
332332
((InfinitePagerAdapter)mPager.getAdapter()).getRealAdapter().registerDataSetObserver(dataChangeObserver);
333333
}
334334

@@ -455,8 +455,7 @@ public void onPageSelected(int position) {
455455
if(mItemCount == 0){
456456
return;
457457
}
458-
int n = position % mItemCount;
459-
setItemAsSelected(n - 1);
458+
setItemAsSelected(position-1);
460459
}
461460
@Override
462461
public void onPageScrollStateChanged(int state) {

library/src/main/java/com/daimajia/slider/library/SliderLayout.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,16 @@ public boolean onTouch(View v, MotionEvent event) {
213213
}
214214
}
215215

216+
public void addOnPageChangeListener(ViewPagerEx.OnPageChangeListener onPageChangeListener){
217+
if(onPageChangeListener != null){
218+
mViewPager.addOnPageChangeListener(onPageChangeListener);
219+
}
220+
}
221+
222+
public void removeOnPageChangeListener(ViewPagerEx.OnPageChangeListener onPageChangeListener) {
223+
mViewPager.removeOnPageChangeListener(onPageChangeListener);
224+
}
225+
216226
public void setCustomIndicator(PagerIndicator indicator){
217227
if(mIndicator != null){
218228
mIndicator.destroySelf();

library/src/main/java/com/daimajia/slider/library/Tricks/ViewPagerEx.java

Lines changed: 45 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ public float getInterpolation(float t) {
208208
private boolean mCalledSuper;
209209
private int mDecorChildCount;
210210

211-
private OnPageChangeListener mOnPageChangeListener;
211+
private ArrayList<OnPageChangeListener> mOnPageChangeListeners = new ArrayList<>();
212212
private OnPageChangeListener mInternalPageChangeListener;
213213
private OnAdapterChangeListener mAdapterChangeListener;
214214
private PageTransformer mPageTransformer;
@@ -305,6 +305,21 @@ public void onPageScrollStateChanged(int state) {
305305
}
306306
}
307307

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+
}
308323
/**
309324
* A PageTransformer is invoked whenever a visible/attached page is scrolled.
310325
* This offers an opportunity for the application to apply a custom transformation
@@ -394,8 +409,10 @@ private void setScrollState(int newState) {
394409
// PageTransformers can do complex things that benefit from hardware layers.
395410
enableLayers(newState != SCROLL_STATE_IDLE);
396411
}
397-
if (mOnPageChangeListener != null) {
398-
mOnPageChangeListener.onPageScrollStateChanged(newState);
412+
for (OnPageChangeListener eachListener : mOnPageChangeListeners) {
413+
if (eachListener != null) {
414+
eachListener.onPageScrollStateChanged(newState);
415+
}
399416
}
400417
}
401418

@@ -539,12 +556,7 @@ void setCurrentItemInternal(int item, boolean smoothScroll, boolean always, int
539556
// We don't have any idea how big we are yet and shouldn't have any pages either.
540557
// Just set things up and let the pending layout handle things.
541558
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);
548560
requestLayout();
549561
} else {
550562
populate(item);
@@ -563,18 +575,12 @@ private void scrollToItem(int item, boolean smoothScroll, int velocity,
563575
}
564576
if (smoothScroll) {
565577
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);
571580
}
572581
} 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);
578584
}
579585
completeScroll(false);
580586
scrollTo(destX, 0);
@@ -583,13 +589,25 @@ private void scrollToItem(int item, boolean smoothScroll, int velocity,
583589
}
584590

585591
/**
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
587593
* scrolled. See {@link OnPageChangeListener}.
588594
*
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
590608
*/
591-
public void setOnPageChangeListener(OnPageChangeListener listener) {
592-
mOnPageChangeListener = listener;
609+
public void removeOnPageChangeListener(OnPageChangeListener listener) {
610+
mOnPageChangeListeners.remove(listener);
593611
}
594612

595613
/**
@@ -1706,9 +1724,10 @@ protected void onPageScrolled(int position, float offset, int offsetPixels) {
17061724
}
17071725
}
17081726
}
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+
}
17121731
}
17131732
if (mInternalPageChangeListener != null) {
17141733
mInternalPageChangeListener.onPageScrolled(position, offset, offsetPixels);

0 commit comments

Comments
 (0)