@Override
  public final View getView(int position, View convertView, ViewGroup parent) {
    ContextualUndoView contextualUndoView = (ContextualUndoView) convertView;
    if (contextualUndoView == null) {
      contextualUndoView =
          new ContextualUndoView(parent.getContext(), mUndoLayoutId, mCountDownTextViewResId);
      contextualUndoView
          .findViewById(mUndoActionId)
          .setOnClickListener(new UndoListener(contextualUndoView));
    }

    View contentView =
        super.getView(position, contextualUndoView.getContentView(), contextualUndoView);
    contextualUndoView.updateContentView(contentView);

    long itemId = getItemId(position);

    if (itemId == mCurrentRemovedId) {
      contextualUndoView.displayUndo();
      mCurrentRemovedView = contextualUndoView;
      long millisLeft = mAutoDeleteDelayMillis - (System.currentTimeMillis() - mDismissStartMillis);
      if (mCountDownFormatter != null) {
        mCurrentRemovedView.updateCountDownTimer(
            mCountDownFormatter.getCountDownString(millisLeft));
      }
    } else {
      contextualUndoView.displayContentView();
    }

    contextualUndoView.setItemId(itemId);
    return contextualUndoView;
  }
  private void startAutoDeleteTimer() {
    mHandler.removeCallbacks(mCountDownRunnable);

    if (mCountDownFormatter != null) {
      mCurrentRemovedView.updateCountDownTimer(
          mCountDownFormatter.getCountDownString(mAutoDeleteDelayMillis));
    }

    mDismissStartMillis = System.currentTimeMillis();
    mHandler.postDelayed(mCountDownRunnable, Math.min(1000, mAutoDeleteDelayMillis));
  }