From b83a1909596362ce9dd0648261dee7731f7f42b8 Mon Sep 17 00:00:00 2001 From: Frank Kwok Date: Tue, 11 Jul 2017 09:26:47 +0800 Subject: [PATCH] fix #1299 --- .../base/BaseItemDraggableAdapter.java | 39 +++++++++++-------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java b/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java index 1cbcb847e..1372788fa 100644 --- a/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java +++ b/library/src/main/java/com/chad/library/adapter/base/BaseItemDraggableAdapter.java @@ -77,12 +77,12 @@ public void onBindViewHolder(K holder, int positions) { } - /** - * Set the toggle view's id which will trigger drag event. - * If the toggle view id is not set, drag event will be triggered when the item is long pressed. - * - * @param toggleViewId the toggle view's id - */ + /** + * Set the toggle view's id which will trigger drag event. + * If the toggle view id is not set, drag event will be triggered when the item is long pressed. + * + * @param toggleViewId the toggle view's id + */ public void setToggleViewId(int toggleViewId) { mToggleViewId = toggleViewId; } @@ -198,16 +198,18 @@ public void onItemDragMoving(RecyclerView.ViewHolder source, RecyclerView.ViewHo int from = getViewHolderPosition(source); int to = getViewHolderPosition(target); - if (from < to) { - for (int i = from; i < to; i++) { - Collections.swap(mData, i, i + 1); - } - } else { - for (int i = from; i > to; i--) { - Collections.swap(mData, i, i - 1); + if (inRange(from) && inRange(to)) { + if (from < to) { + for (int i = from; i < to; i++) { + Collections.swap(mData, i, i + 1); + } + } else { + for (int i = from; i > to; i--) { + Collections.swap(mData, i, i - 1); + } } + notifyItemMoved(source.getAdapterPosition(), target.getAdapterPosition()); } - notifyItemMoved(source.getAdapterPosition(), target.getAdapterPosition()); if (mOnItemDragListener != null && itemDragEnabled) { mOnItemDragListener.onItemDragMoving(source, from, target, to); @@ -243,8 +245,10 @@ public void onItemSwiped(RecyclerView.ViewHolder viewHolder) { int pos = getViewHolderPosition(viewHolder); - mData.remove(pos); - notifyItemRemoved(viewHolder.getAdapterPosition()); + if (inRange(pos)) { + mData.remove(pos); + notifyItemRemoved(viewHolder.getAdapterPosition()); + } } public void onItemSwiping(Canvas canvas, RecyclerView.ViewHolder viewHolder, float dX, float dY, boolean isCurrentlyActive) { @@ -253,4 +257,7 @@ public void onItemSwiping(Canvas canvas, RecyclerView.ViewHolder viewHolder, flo } } + private boolean inRange(int position) { + return position >= 0 && position < mData.size(); + } }