private void updateIndicatorViewsVisibility() {
    if (null != mIndicatorIvTop) {
      if (!isRefreshing() && isReadyForPullDown()) {
        if (!mIndicatorIvTop.isVisible()) {
          mIndicatorIvTop.show();
        }
      } else {
        if (mIndicatorIvTop.isVisible()) {
          mIndicatorIvTop.hide();
        }
      }
    }

    if (null != mIndicatorIvBottom) {
      if (!isRefreshing() && isReadyForPullUp()) {
        if (!mIndicatorIvBottom.isVisible()) {
          mIndicatorIvBottom.show();
        }
      } else {
        if (mIndicatorIvBottom.isVisible()) {
          mIndicatorIvBottom.hide();
        }
      }
    }
  }
  @Override
  protected void onReleaseToRefresh() {
    super.onReleaseToRefresh();

    if (getShowIndicatorInternal()) {
      switch (getCurrentMode()) {
        case PULL_UP_TO_REFRESH:
          mIndicatorIvBottom.releaseToRefresh();
          break;
        case PULL_DOWN_TO_REFRESH:
          mIndicatorIvTop.releaseToRefresh();
          break;
      }
    }
  }
  @Override
  void onPullToRefresh() {
    super.onPullToRefresh();

    if (getShowIndicatorInternal()) {
      switch (getCurrentMode()) {
        case PULL_UP_TO_REFRESH:
          mIndicatorIvBottom.pullToRefresh();
          break;
        case PULL_DOWN_TO_REFRESH:
          mIndicatorIvTop.pullToRefresh();
          break;
      }
    }
  }
  @Override
  protected void onReleaseToRefresh() {
    super.onReleaseToRefresh();

    if (getShowIndicatorInternal()) {
      switch (getCurrentMode()) {
        case PULL_FROM_END:
          mIndicatorIvBottom.releaseToRefresh();
          break;
        case PULL_FROM_START:
          mIndicatorIvTop.releaseToRefresh();
          break;
        default:
          // NO-OP
          break;
      }
    }
  }