Skip to content

Commit

Permalink
Merge pull request #99 from elfman/master
Browse files Browse the repository at this point in the history
添加滑动删除功能
  • Loading branch information
CymChad authored Jun 23, 2016
2 parents 7e8c954 + 03078c5 commit a90d8ce
Show file tree
Hide file tree
Showing 7 changed files with 195 additions and 42 deletions.
30 changes: 24 additions & 6 deletions README-cn.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,22 +200,40 @@ public class MultipleItemQuickAdapter extends BaseMultiItemQuickAdapter<Multiple
```
mQuickAdapter.setEmptyView(getView());
```
#使用DragItem
#使用拖拽与滑动删除
![demo](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/blob/master/demo_res/drag_item.gif)
```java
OnItemDragListener listener = new OnItemDragListener() {
OnItemDragListener onItemDragListener = new OnItemDragListener() {
@Override
public void onItemDragStart(RecyclerView.ViewHolder viewHolder){}
public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}
@Override
public void onItemDragMoving(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {}
public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}
@Override
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder) {}
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {}
}

OnItemSwipedListener onItemSwipedListener = new OnItemSwipedListener() {
@Override
public void onItemSwipedStart(RecyclerView.ViewHolder viewHolder, int pos) {}
@Override
public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {}
@Override
public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {}
};

ItemDraggableCallback itemDraggableCallback = new ItemDraggableCallback(mAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDraggableCallback);
mItemTouchHelper.attachToRecyclerView(mRecyclerView);

// 开启拖拽
mAdapter.enableDragItem(mItemTouchHelper, R.id.textView, true);
mAdapter.setOnItemDragListener(listener);
mAdapter.setOnItemDragListener(onItemDragListener);

// 开启滑动删除
mAdapter.enableSwipeItem();
mAdapter.setOnItemSwipedListener(onItemSwipedListener);
```

>**持续更新!,所以推荐Star项目**
#感谢
Expand Down
30 changes: 23 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -202,23 +202,39 @@ public class SectionAdapter extends BaseSectionQuickAdapter<MySection> {
```java
mQuickAdapter.setEmptyView(getView());
```
#Use it drag item
#Use it drag and swipe item
![demo](https://github.com/CymChad/BaseRecyclerViewAdapterHelper/blob/master/demo_res/drag_item.gif)
```java
OnItemDragListener listener = new OnItemDragListener() {
OnItemDragListener onItemDragListener = new OnItemDragListener() {
@Override
public void onItemDragStart(RecyclerView.ViewHolder viewHolder){}
public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos){}
@Override
public void onItemDragMoving(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {}
public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {}
@Override
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder) {}
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {}
}

OnItemSwipedListener onItemSwipedListener = new OnItemSwipedListener() {
@Override
public void onItemSwipedStart(RecyclerView.ViewHolder viewHolder, int pos) {}
@Override
public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {}
@Override
public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {}
};

ItemDraggableCallback itemDraggableCallback = new ItemDraggableCallback(mAdapter);
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemDraggableCallback);
mItemTouchHelper.attachToRecyclerView(mRecyclerView);

// enable drag items
mAdapter.enableDragItem(mItemTouchHelper, R.id.textView, true);
mAdapter.setOnItemDragListener(listener);
```
mAdapter.setOnItemDragListener(onItemDragListener);

// enable swipe items
mAdapter.enableSwipeItem();
mAdapter.setOnItemSwipedListener(onItemSwipedListener);
```

#Thanks
[JoanZapata / base-adapter-helper](https://github.com/JoanZapata/base-adapter-helper)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import com.chad.library.adapter.base.BaseViewHolder;
import com.chad.library.adapter.base.callback.ItemDraggableCallback;
import com.chad.library.adapter.base.listener.OnItemDragListener;
import com.chad.library.adapter.base.listener.OnItemSwipedListener;

import java.util.ArrayList;
import java.util.List;
Expand All @@ -35,33 +36,59 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_item_touch_use);

mRecyclerView = (RecyclerView)findViewById(R.id.rv_list);
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mData = generateData(50);
OnItemDragListener listener = new OnItemDragListener() {
@Override
public void onItemDragStart(RecyclerView.ViewHolder viewHolder) {
public void onItemDragStart(RecyclerView.ViewHolder viewHolder, int pos) {
Log.d(TAG, "drag start");
BaseViewHolder holder = ((BaseViewHolder)viewHolder);
holder.setTextColor(R.id.tv, Color.WHITE);
((CardView)viewHolder.itemView).setCardBackgroundColor(ContextCompat.getColor(ItemDragUseActivity.this, R.color.color_light_blue));
}

@Override
public void onItemDragMoving(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
public void onItemDragMoving(RecyclerView.ViewHolder source, int from, RecyclerView.ViewHolder target, int to) {
Log.d(TAG, "move from: " + source.getAdapterPosition() + " to: " + target.getAdapterPosition());
}

@Override
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder) {
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder, int pos) {
Log.d(TAG, "drag end");
BaseViewHolder holder = ((BaseViewHolder)viewHolder);
holder.setTextColor(R.id.tv, Color.BLACK);
((CardView)viewHolder.itemView).setCardBackgroundColor(Color.WHITE);
}
};
OnItemSwipedListener onItemSwipedListener = new OnItemSwipedListener() {
@Override
public void onItemSwipedStart(RecyclerView.ViewHolder viewHolder, int pos) {
Log.d(TAG, "view swiped start: " + pos);
BaseViewHolder holder = ((BaseViewHolder)viewHolder);
holder.setTextColor(R.id.tv, Color.WHITE);
((CardView)viewHolder.itemView).setCardBackgroundColor(Color.YELLOW);
}

@Override
public void clearView(RecyclerView.ViewHolder viewHolder, int pos) {
Log.d(TAG, "View reset: " + pos);
Log.d(TAG, "clearView holder pos: " + viewHolder.getAdapterPosition());
BaseViewHolder holder = ((BaseViewHolder)viewHolder);
holder.setTextColor(R.id.tv, Color.BLACK);
((CardView)viewHolder.itemView).setCardBackgroundColor(Color.WHITE);
}

@Override
public void onItemSwiped(RecyclerView.ViewHolder viewHolder, int pos) {
Log.d(TAG, "View Swiped: " + pos);
Log.d(TAG, "Swiped holder pos: " + viewHolder.getAdapterPosition());
}
};
mAdapter = new ItemDragAdapter(mData);
mItemDraggableCallback = new ItemDraggableCallback(mAdapter);
mItemTouchHelper = new ItemTouchHelper(mItemDraggableCallback);
mAdapter.enableSwipeItem();
mAdapter.setOnItemSwipedListener(onItemSwipedListener);
mAdapter.enableDragItem(mItemTouchHelper);
mAdapter.setOnItemDragListener(listener);
mRecyclerView.setAdapter(mAdapter);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.animation.Animator;
import android.content.Context;
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.v4.view.MotionEventCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
Expand All @@ -23,6 +24,7 @@
import com.chad.library.adapter.base.animation.SlideInLeftAnimation;
import com.chad.library.adapter.base.animation.SlideInRightAnimation;
import com.chad.library.adapter.base.listener.OnItemDragListener;
import com.chad.library.adapter.base.listener.OnItemSwipedListener;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
Expand Down Expand Up @@ -101,12 +103,17 @@ public abstract class BaseQuickAdapter<T> extends RecyclerView.Adapter<RecyclerV
private static final int NO_TOGGLE_VIEW = 0;
private int mToggleViewId = NO_TOGGLE_VIEW;
private ItemTouchHelper mItemTouchHelper;
private boolean itemDragEnabled = false;
private boolean itemSwipeEnabled = false;
private OnItemDragListener mOnItemDragListener;
private OnItemSwipedListener mOnItemSwipedListener;
private boolean mDragOnLongPress = true;

private View.OnTouchListener mOnToggleViewTouchListener;
private View.OnLongClickListener mOnToggleViewLongClickListener;

private static final String ERROR_NOT_SAME_ITEMTOUCHHELPER = "Item drag and item swipe should pass the same ItemTouchHelper";

/**
* call the method will not enable the loadMore funcation and the params pageSize is invalid
* more infomation see{@link public void openLoadMore(int pageSize, boolean enable),@link public void setOnLoadMoreListener(RequestLoadMoreListener requestLoadMoreListener)} method
Expand Down Expand Up @@ -560,7 +567,7 @@ public void onBindViewHolder(final RecyclerView.ViewHolder holder, int positions
break;
}

if (mItemTouchHelper != null && viewType != LOADING_VIEW && viewType != HEADER_VIEW
if (mItemTouchHelper != null && itemDragEnabled && viewType != LOADING_VIEW && viewType != HEADER_VIEW
&& viewType != EMPTY_VIEW && viewType != FOOTER_VIEW) {
if (mToggleViewId != NO_TOGGLE_VIEW) {
View toggleView = ((BaseViewHolder)holder).getView(mToggleViewId);
Expand Down Expand Up @@ -879,7 +886,7 @@ public void setToggleDragOnLongPress(boolean longPress) {
mOnToggleViewLongClickListener = new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mItemTouchHelper != null) {
if (mItemTouchHelper != null && itemDragEnabled) {
mItemTouchHelper.startDrag((RecyclerView.ViewHolder) v.getTag());
}
return true;
Expand All @@ -891,7 +898,7 @@ public boolean onLongClick(View v) {
public boolean onTouch(View v, MotionEvent event) {
if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN
&& !mDragOnLongPress) {
if (mItemTouchHelper != null) {
if (mItemTouchHelper != null && itemDragEnabled) {
mItemTouchHelper.startDrag((RecyclerView.ViewHolder) v.getTag());
}
return true;
Expand All @@ -904,16 +911,12 @@ public boolean onTouch(View v, MotionEvent event) {
}
}

public boolean shouldToggleOnLongPress() {
return mToggleViewId == NO_TOGGLE_VIEW || mDragOnLongPress;
}

/**
* Enable drag items.
* Use itemView as the toggleView when long pressed.
* @param itemTouchHelper {@link ItemTouchHelper}
*/
public void enableDragItem(ItemTouchHelper itemTouchHelper) {
public void enableDragItem(@NonNull ItemTouchHelper itemTouchHelper) {
enableDragItem(itemTouchHelper, NO_TOGGLE_VIEW, true);
}

Expand All @@ -923,7 +926,8 @@ public void enableDragItem(ItemTouchHelper itemTouchHelper) {
* @param toggleViewId The toggle view's id.
* @param dragOnLongPress If true the drag event will be trigger on long press, otherwise on touch down.
*/
public void enableDragItem(ItemTouchHelper itemTouchHelper, int toggleViewId, boolean dragOnLongPress) {
public void enableDragItem(@NonNull ItemTouchHelper itemTouchHelper, int toggleViewId, boolean dragOnLongPress) {
itemDragEnabled = true;
mItemTouchHelper = itemTouchHelper;
setToggleViewId(toggleViewId);
setToggleDragOnLongPress(dragOnLongPress);
Expand All @@ -933,26 +937,46 @@ public void enableDragItem(ItemTouchHelper itemTouchHelper, int toggleViewId, bo
* Disable drag items.
*/
public void disableDragItem() {
itemDragEnabled = false;
mItemTouchHelper = null;
}

public boolean isItemDraggable() {
return itemDragEnabled;
}

public void enableSwipeItem() {
itemSwipeEnabled = true;
}

public void disableSwipeItem() {
itemSwipeEnabled = false;
}

public boolean isItemSwipeEnable() {
return itemSwipeEnabled;
}

/**
* @param onItemDragListener Register a callback to be invoked when drag event happen.
*/
public void setOnItemDragListener(OnItemDragListener onItemDragListener) {
mOnItemDragListener = onItemDragListener;
}

public int getViewHolderPosition(RecyclerView.ViewHolder viewHolder) {
return viewHolder.getAdapterPosition() - getHeaderViewsCount();
}

public void onItemDragStart(RecyclerView.ViewHolder viewHolder) {
if (mOnItemDragListener != null) {
mOnItemDragListener.onItemDragStart(viewHolder);
if (mOnItemDragListener != null && itemDragEnabled) {
mOnItemDragListener.onItemDragStart(viewHolder, getViewHolderPosition(viewHolder));
}
}

public void onItemDragMoving(RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
int from = source.getAdapterPosition() - getHeaderViewsCount();
int to = target.getAdapterPosition() - getHeaderViewsCount();
int from = getViewHolderPosition(source);
int to = getViewHolderPosition(target);

if (from < to) {
for (int i = from; i < to; i++) {
Expand All @@ -965,16 +989,42 @@ public void onItemDragMoving(RecyclerView.ViewHolder source, RecyclerView.ViewHo
}
notifyItemMoved(source.getAdapterPosition(), target.getAdapterPosition());

if (mOnItemDragListener != null) {
mOnItemDragListener.onItemDragMoving(source, target);
if (mOnItemDragListener != null && itemDragEnabled) {
mOnItemDragListener.onItemDragMoving(source, from, target, to);
}
}

public void onItemDragEnd(RecyclerView.ViewHolder holder) {
public void onItemDragEnd(RecyclerView.ViewHolder viewHolder) {
if (mOnItemDragListener != null && itemDragEnabled) {
mOnItemDragListener.onItemDragEnd(viewHolder, getViewHolderPosition(viewHolder));
}
}

public void setOnItemSwipedListener(OnItemSwipedListener listener) {
mOnItemSwipedListener = listener;
}

public void onItemSwipeStart(RecyclerView.ViewHolder viewHolder) {
if (mOnItemSwipedListener != null && itemSwipeEnabled) {
mOnItemSwipedListener.onItemSwipedStart(viewHolder, getViewHolderPosition(viewHolder));
}
}

public void onItemSwipeClear(RecyclerView.ViewHolder viewHolder) {
if (mOnItemSwipedListener != null && itemSwipeEnabled) {
mOnItemSwipedListener.clearView(viewHolder, getViewHolderPosition(viewHolder));
}
}

if (mOnItemDragListener != null) {
mOnItemDragListener.onItemDragEnd(holder);
public void onItemSwiped(RecyclerView.ViewHolder viewHolder) {
if (mOnItemSwipedListener != null && itemSwipeEnabled) {
mOnItemSwipedListener.onItemSwiped(viewHolder, getViewHolderPosition(viewHolder));
}

int pos = getViewHolderPosition(viewHolder);

mData.remove(pos);
notifyItemRemoved(viewHolder.getAdapterPosition());
}

}
Loading

0 comments on commit a90d8ce

Please sign in to comment.