docs: public void updateItemAt(int index, T item) {
          final T existing = get(index);
          // assume changed if the same object is given back
          boolean contentsChanged = existing == item || !mCallback.areContentsTheSame(existing, item);
          if (existing != item) {
              // different items, we can use comparison and may avoid lookup
              final int cmp = mCallback.compare(existing, item);
              if (cmp == 0) {
                  mData[index] = item;
                  if (contentsChanged) {
                      mCallback.onChanged(index, 1);
                  }
                  return;
              }
          }
          if (contentsChanged) {
              mCallback.onChanged(index, 1);
          }
          // TODO this done in 1 pass to avoid shifting twice.
          removeItemAtIndex(index, false);
          int newIndex = add(item, false);
          if (index != newIndex) {
              mCallback.onMoved(index, newIndex);
          }
      }