private boolean adapterPositionChanged() {
   if (rippleInAdapter) {
     int newPosition = findParentAdapterView().getPositionForView(MaterialRippleLayout.this);
     final boolean changed = newPosition != positionInAdapter;
     positionInAdapter = newPosition;
     if (changed) {
       cancelPressedEvent();
       cancelAnimations();
       childView.setPressed(false);
       setRadius(0);
     }
     return changed;
   }
   return false;
 }
  private void startRipple(final Runnable animationEndRunnable) {
    if (eventCancelled) return;

    float endRadius = getEndRadius();

    cancelAnimations();

    rippleAnimator = new AnimatorSet();
    rippleAnimator.addListener(
        new AnimatorListenerAdapter() {
          @Override
          public void onAnimationEnd(Animator animation) {
            if (!ripplePersistent) {
              setRadius(0);
              setRippleAlpha(rippleAlpha);
            }
            if (animationEndRunnable != null && rippleDelayClick) {
              animationEndRunnable.run();
            }
            childView.setPressed(false);
          }
        });

    ObjectAnimator ripple = ObjectAnimator.ofFloat(this, radiusProperty, radius, endRadius);
    ripple.setDuration(rippleDuration);
    ripple.setInterpolator(new DecelerateInterpolator());
    ObjectAnimator fade = ObjectAnimator.ofInt(this, circleAlphaProperty, rippleAlpha, 0);
    fade.setDuration(rippleFadeDuration);
    fade.setInterpolator(new AccelerateInterpolator());
    fade.setStartDelay(rippleDuration - rippleFadeDuration - FADE_EXTRA_DELAY);

    if (ripplePersistent) {
      rippleAnimator.play(ripple);
    } else if (getRadius() > endRadius) {
      fade.setStartDelay(0);
      rippleAnimator.play(fade);
    } else {
      rippleAnimator.playTogether(ripple, fade);
    }
    rippleAnimator.start();
  }