private void manipulatePending() {

    if (!pendingManipulationsWithoutAnimation.isEmpty()) {
      animating = true;
      for (final Manipulator manipulator : pendingManipulationsWithoutAnimation) {
        manipulator.manipulate(adapter.adapter);
      }
      pendingManipulationsWithoutAnimation.clear();
      adapter.notifyDataSetChanged();

      post(
          new Runnable() {

            @Override
            public void run() {
              animating = false;
              manipulatePending();
            }
          });
    } else {

      if (pendingManipulations.isEmpty()) {
        return;
      }

      prepareAnimation();

      for (final Manipulator manipulator : pendingManipulations) {
        manipulator.manipulate(adapter.adapter);
      }
      pendingManipulations.clear();

      doAnimation();
    }
  }
 public <T extends ListAdapter> void manipulateWithoutAnimation(final Manipulator<T> manipulator) {
   if (!animating) {
     manipulator.manipulate((T) adapter.adapter);
     adapter.notifyDataSetChanged();
   } else {
     pendingManipulationsWithoutAnimation.add(manipulator);
   }
 }
  public <T extends ListAdapter> void manipulate(final Manipulator<T> manipulator) {
    if (!animating) {
      prepareAnimation();

      manipulator.manipulate((T) adapter.adapter);

      doAnimation();
    } else {
      pendingManipulations.add(manipulator);
    }
  }
 public static void main(String[] args) {
   HasF hf = new HasF();
   Manipulator<HasF> manipulator = new Manipulator<HasF>(hf);
   manipulator.manipulate();
 }