@Override
 public void onItemRangeRemoved(int positionStart, int itemCount) {
   final BaseWrapperAdapter<VH> holder = mRefHolder.get();
   if (holder != null) {
     holder.onWrappedAdapterItemRangeRemoved(positionStart, itemCount);
   }
 }
 @Override
 public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
   final BaseWrapperAdapter<VH> holder = mRefHolder.get();
   if (holder != null) {
     holder.onWrappedAdapterItemRangeChanged(positionStart, itemCount, payload);
   }
 }
 @Override
 public void onChanged() {
   final BaseWrapperAdapter<VH> holder = mRefHolder.get();
   if (holder != null) {
     holder.onWrappedAdapterChanged();
   }
 }
    @Override
    public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
      final BaseWrapperAdapter<VH> holder = mRefHolder.get();

      if (holder != null) {
        holder.onWrappedAdapterRangeMoved(fromPosition, toPosition, itemCount);
      }
    }
 @Override
 protected void onRelease() {
   super.onRelease();
   mDraggingItem = null;
   mDraggableItemAdapter = null;
   mDragDropManager = null;
 }
 @Override
 protected void onHandleWrappedAdapterRangeMoved(int fromPosition, int toPosition, int itemCount) {
   if (shouldCancelDragOnDataUpdated()) {
     cancelDrag();
   } else {
     super.onHandleWrappedAdapterRangeMoved(fromPosition, toPosition, itemCount);
   }
 }
 @Override
 protected void onHandleWrappedAdapterItemRangeRemoved(int positionStart, int itemCount) {
   if (shouldCancelDragOnDataUpdated()) {
     cancelDrag();
   } else {
     super.onHandleWrappedAdapterItemRangeRemoved(positionStart, itemCount);
   }
 }
 @Override
 protected void onHandleWrappedAdapterChanged() {
   if (shouldCancelDragOnDataUpdated()) {
     cancelDrag();
   } else {
     super.onHandleWrappedAdapterChanged();
   }
 }
  @Override
  public void onViewRecycled(VH holder) {
    if (isDragging()) {
      if (holder == mDraggingItem) {
        if (LOCAL_LOGI) {
          Log.i(TAG, "a view holder object which is bound to currently dragging item is recycled");
        }
        mDraggingItem = null;
        mDragDropManager.onDraggingItemViewRecycled();
      }
    }

    super.onViewRecycled(holder);
  }
  @Override
  public void onBindViewHolder(VH holder, int position) {
    if (isDragging()) {
      final long itemId = holder.getItemId();

      final int origPosition =
          convertToOriginalPosition(
              position, mDraggingItemInitialPosition, mDraggingItemCurrentPosition);

      if (itemId == mDraggingItemId && holder != mDraggingItem) {
        if (mDraggingItem == null) {
          if (LOCAL_LOGI) {
            Log.i(TAG, "a new view holder object for the currently dragging item is assigned");
          }
          mDraggingItem = holder;
          mDragDropManager.onNewDraggingItemViewBinded(holder);
        } else {
          Log.e(TAG, "an another view holder object for the currently dragging item is assigned");
        }
      }

      int flags = RecyclerViewDragDropManager.STATE_FLAG_DRAGGING;

      if (itemId == mDraggingItemId) {
        flags |= RecyclerViewDragDropManager.STATE_FLAG_IS_ACTIVE;
      }
      if (mDraggableRange.checkInRange(position)) {
        flags |= RecyclerViewDragDropManager.STATE_FLAG_IS_IN_RANGE;
      }

      safeUpdateFlags(holder, flags);
      super.onBindViewHolder(holder, origPosition);
    } else {
      safeUpdateFlags(holder, 0);
      super.onBindViewHolder(holder, position);
    }
  }