/** Animate items that just appeared and items that move within the screen. */
  private void animatePostLayout(final float durationUnit) {

    final AnimatorSet animatorSet = new AnimatorSet();

    for (int i = 0; i < getChildCount(); i++) {
      final View child = getChildAt(i);
      final long id = getItemIdAtPosition(getFirstVisiblePosition() + i);

      ObjectAnimator anim = null;

      ViewHelper.setAlpha(child, 1f);

      if (yMap.containsKey(id)) {
        // moved within visible area

        // log("Moved within visible area id: " + id);
        final float oldY = yMap.remove(id);
        final float newY = ViewHelper.getY(child);

        if (oldY != newY) {
          anim = animateY(child, oldY, newY, durationUnit);
        }

      } else {
        // moved into visible area or new

        if (beforeVisible.contains(id)) {
          // moved from top
          final float newY = ViewHelper.getY(child);
          final float oldY = -child.getHeight();

          anim = animateY(child, oldY, newY, durationUnit);
        } else if (afterVisible.contains(id)) {
          // moved from bottom
          final float newY = ViewHelper.getY(child);
          final float oldY = getHeight();

          anim = animateY(child, oldY, newY, durationUnit);
        } else {
          // entirely new
          ViewHelper.setAlpha(child, 0f);

          anim = animateAlpha(child, true);
          anim.setStartDelay(MIN_ANIM_DURATION);
        }
      }

      if (anim != null) {
        animatorSet.play(anim);
      }
    }

    animatorSet.addListener(
        new AnimatorListenerAdapter() {
          @Override
          public void onAnimationEnd(final Animator animation) {
            finishAnimation();
          };
        });

    animatorSet.start();
  }