@Override
 public void onChanged() {
   PagerAdapter adapter = mPager.getAdapter();
   int count = 0;
   if (adapter instanceof InfinitePagerAdapter) {
     count = ((InfinitePagerAdapter) adapter).getRealCount();
   } else {
     count = adapter.getCount();
   }
   if (count > mItemCount) {
     for (int i = 0; i < count - mItemCount; i++) {
       ImageView indicator = new ImageView(mContext);
       indicator.setImageDrawable(mUnselectedDrawable);
       indicator.setPadding(
           (int) mUnSelectedPadding_Left,
           (int) mUnSelectedPadding_Top,
           (int) mUnSelectedPadding_Right,
           (int) mUnSelectedPadding_Bottom);
       addView(indicator);
       mIndicators.add(indicator);
     }
   } else if (count < mItemCount) {
     for (int i = 0; i < mItemCount - count; i++) {
       removeView(mIndicators.get(0));
       mIndicators.remove(0);
     }
   }
   mItemCount = count;
   mPager.setCurrentItem(mItemCount * 20 + mPager.getCurrentItem());
 }
 /**
  * since we used a adapter wrapper, so we can't getCount directly from wrapper.
  *
  * @return
  */
 private int getShouldDrawCount() {
   if (mPager.getAdapter() instanceof InfinitePagerAdapter) {
     return ((InfinitePagerAdapter) mPager.getAdapter()).getRealCount();
   } else {
     return mPager.getAdapter().getCount();
   }
 }
 /**
  * bind indicator with viewpagerEx.
  *
  * @param pager
  */
 public void setViewPager(ViewPagerEx pager) {
   if (pager.getAdapter() == null) {
     throw new IllegalStateException("Viewpager does not have adapter instance");
   }
   mPager = pager;
   mPager.setOnPageChangeListener(this);
   ((InfinitePagerAdapter) mPager.getAdapter())
       .getRealAdapter()
       .registerDataSetObserver(dataChangeObserver);
 }
 /**
  * clear self means unregister the dataset observer and remove all the child views(indicators).
  */
 public void destroySelf() {
   if (mPager == null || mPager.getAdapter() == null) {
     return;
   }
   InfinitePagerAdapter wrapper = (InfinitePagerAdapter) mPager.getAdapter();
   PagerAdapter adapter = wrapper.getRealAdapter();
   if (adapter != null) {
     adapter.unregisterDataSetObserver(dataChangeObserver);
   }
   removeAllViews();
 }