content: package com.adafruit.bluefruit.le.connect.utils;
  
  import android.view.View;
  import android.view.ViewGroup;
  import android.view.animation.Animation;
  import android.view.animation.Transformation;
  
  public class AdapterUtils {
  
      // from: https://stackoverflow.com/questions/4946295/android-expand-collapse-animation
      public static void expand(final View v) {
          v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
          final int targetHeight = v.getMeasuredHeight();
  
          // Older versions of android (pre API 21) cancel animations for views with a height of 0.
          v.getLayoutParams().height = 1;
          v.setVisibility(View.VISIBLE);
          Animation a = new Animation() {
              @Override
              protected void applyTransformation(float interpolatedTime, Transformation t) {
                  v.getLayoutParams().height = interpolatedTime == 1
                          ? ViewGroup.LayoutParams.WRAP_CONTENT
                          : (int) (targetHeight * interpolatedTime);
                  v.requestLayout();
              }
  
              @Override
              public boolean willChangeBounds() {
                  return true;
              }
          };
  
          // 1dp/ms
          a.setDuration((int) (targetHeight / v.getContext().getResources().getDisplayMetrics().density));
          v.startAnimation(a);
      }
  
      public static void collapse(final View v) {
          final int initialHeight = v.getMeasuredHeight();
  
          Animation a = new Animation() {
              @Override
              protected void applyTransformation(float interpolatedTime, Transformation t) {
                  if (interpolatedTime == 1) {
                      v.setVisibility(View.GONE);
                  } else {
                      v.getLayoutParams().height = initialHeight - (int) (initialHeight * interpolatedTime);
                      v.requestLayout();
                  }
              }
  
              @Override
              public boolean willChangeBounds() {
                  return true;
              }
          };
  
          // 1dp/ms
          a.setDuration((int) (initialHeight / v.getContext().getResources().getDisplayMetrics().density));
          v.startAnimation(a);
      }
  }
  