Android APIs
public class

ItemTouchHelper

extends RecyclerView.ItemDecoration
implements RecyclerView.OnChildAttachStateChangeListener
java.lang.Object
   ↳ android.support.v7.widget.RecyclerView.ItemDecoration
     ↳ android.support.v7.widget.helper.ItemTouchHelper

Class Overview

This is a utility class to add swipe to dismiss and drag & drop support to RecyclerView.

It works with a RecyclerView and a Callback class, which configures what type of interactions are enabled and also receives events when user performs these actions.

Depending on which functionality you support, you should override onMove(RecyclerView, ViewHolder, ViewHolder) and / or onSwiped(ViewHolder, int).

This class is designed to work with any LayoutManager but for certain situations, it can be optimized for your custom LayoutManager by extending methods in the ItemTouchHelper.Callback class or implementing ItemTouchHelper.ViewDropHandler interface in your LayoutManager.

By default, ItemTouchHelper moves the items' translateX/Y properties to reposition them. On platforms older than Honeycomb, ItemTouchHelper uses canvas translations and View's visibility property to move items in response to touch events. You can customize these behaviors by overriding onChildDraw(Canvas, RecyclerView, ViewHolder, float, float, int, boolean) or onChildDrawOver(Canvas, RecyclerView, ViewHolder, float, float, int, boolean).

Most of the time, you only need to override onChildDraw but due to limitations of platform prior to Honeycomb, you may need to implement onChildDrawOver as well.

Summary

Nested Classes
class ItemTouchHelper.Callback This class is the contract between ItemTouchHelper and your application. 
class ItemTouchHelper.SimpleCallback A simple wrapper to the default Callback which you can construct with drag and swipe directions and this class will handle the flag callbacks. 
interface ItemTouchHelper.ViewDropHandler An interface which can be implemented by LayoutManager for better integration with ItemTouchHelper
Constants
int ACTION_STATE_DRAG A View is currently being dragged.
int ACTION_STATE_IDLE ItemTouchHelper is in idle state.
int ACTION_STATE_SWIPE A View is currently being swiped.
int ANIMATION_TYPE_DRAG Animation type for views that were dragged and now will animate to their final position.
int ANIMATION_TYPE_SWIPE_CANCEL Animation type for views which are not completely swiped thus will animate back to their original position.
int ANIMATION_TYPE_SWIPE_SUCCESS Animation type for views which are swiped successfully.
int DOWN Down direction, used for swipe & drag control.
int END Horizontal end direction.
int LEFT Left direction, used for swipe & drag control.
int RIGHT Right direction, used for swipe & drag control.
int START Horizontal start direction.
int UP Up direction, used for swipe & drag control.
Public Constructors
ItemTouchHelper(ItemTouchHelper.Callback callback)
Creates an ItemTouchHelper that will work with the given Callback.
Public Methods
void attachToRecyclerView(RecyclerView recyclerView)
Attaches the ItemTouchHelper to the provided RecyclerView.
void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state)
Retrieve any offsets for the given item.
void onChildViewAttachedToWindow(View view)
Called when a view is attached to the RecyclerView.
void onChildViewDetachedFromWindow(View view)
Called when a view is detached from RecyclerView.
void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
Draw any appropriate decorations into the Canvas supplied to the RecyclerView.
void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state)
Draw any appropriate decorations into the Canvas supplied to the RecyclerView.
void startDrag(RecyclerView.ViewHolder viewHolder)
Starts dragging the provided ViewHolder.
void startSwipe(RecyclerView.ViewHolder viewHolder)
Starts swiping the provided ViewHolder.
[Expand]
Inherited Methods
From class android.support.v7.widget.RecyclerView.ItemDecoration
From class java.lang.Object
From interface android.support.v7.widget.RecyclerView.OnChildAttachStateChangeListener

Constants

public static final int ACTION_STATE_DRAG

A View is currently being dragged.

Constant Value: 2 (0x00000002)

public static final int ACTION_STATE_IDLE

ItemTouchHelper is in idle state. At this state, either there is no related motion event by the user or latest motion events have not yet triggered a swipe or drag.

Constant Value: 0 (0x00000000)

public static final int ACTION_STATE_SWIPE

A View is currently being swiped.

Constant Value: 1 (0x00000001)

public static final int ANIMATION_TYPE_DRAG

Animation type for views that were dragged and now will animate to their final position.

Constant Value: 8 (0x00000008)

public static final int ANIMATION_TYPE_SWIPE_CANCEL

Animation type for views which are not completely swiped thus will animate back to their original position.

Constant Value: 4 (0x00000004)

public static final int ANIMATION_TYPE_SWIPE_SUCCESS

Animation type for views which are swiped successfully.

Constant Value: 2 (0x00000002)

public static final int DOWN

Down direction, used for swipe & drag control.

Constant Value: 2 (0x00000002)

public static final int END

Horizontal end direction. Resolved to LEFT or RIGHT depending on RecyclerView's layout direction. Used for swipe & drag control.

Constant Value: 32 (0x00000020)

public static final int LEFT

Left direction, used for swipe & drag control.

Constant Value: 4 (0x00000004)

public static final int RIGHT

Right direction, used for swipe & drag control.

Constant Value: 8 (0x00000008)

public static final int START

Horizontal start direction. Resolved to LEFT or RIGHT depending on RecyclerView's layout direction. Used for swipe & drag control.

Constant Value: 16 (0x00000010)

public static final int UP

Up direction, used for swipe & drag control.

Constant Value: 1 (0x00000001)

Public Constructors

public ItemTouchHelper (ItemTouchHelper.Callback callback)

Creates an ItemTouchHelper that will work with the given Callback.

You can attach ItemTouchHelper to a RecyclerView via attachToRecyclerView(RecyclerView). Upon attaching, it will add an item decoration, an onItemTouchListener and a Child attach / detach listener to the RecyclerView.

Parameters
callback The Callback which controls the behavior of this touch helper.

Public Methods

public void attachToRecyclerView (RecyclerView recyclerView)

Attaches the ItemTouchHelper to the provided RecyclerView. If TouchHelper is already attached to a RecyclerView, it will first detach from the previous one.

Parameters
recyclerView The RecyclerView instance to which you want to add this helper.

public void getItemOffsets (Rect outRect, View view, RecyclerView parent, RecyclerView.State state)

Retrieve any offsets for the given item. Each field of outRect specifies the number of pixels that the item view should be inset by, similar to padding or margin. The default implementation sets the bounds of outRect to 0 and returns.

If this ItemDecoration does not affect the positioning of item views, it should set all four fields of outRect (left, top, right, bottom) to zero before returning.

If you need to access Adapter for additional data, you can call getChildAdapterPosition(View) to get the adapter position of the View.

Parameters
outRect Rect to receive the output.
view The child view to decorate
parent RecyclerView this ItemDecoration is decorating
state The current state of RecyclerView.

public void onChildViewAttachedToWindow (View view)

Called when a view is attached to the RecyclerView.

Parameters
view The View which is attached to the RecyclerView

public void onChildViewDetachedFromWindow (View view)

Called when a view is detached from RecyclerView.

Parameters
view The View which is being detached from the RecyclerView

public void onDraw (Canvas c, RecyclerView parent, RecyclerView.State state)

Draw any appropriate decorations into the Canvas supplied to the RecyclerView. Any content drawn by this method will be drawn before the item views are drawn, and will thus appear underneath the views.

Parameters
c Canvas to draw into
parent RecyclerView this ItemDecoration is drawing into
state The current state of RecyclerView

public void onDrawOver (Canvas c, RecyclerView parent, RecyclerView.State state)

Draw any appropriate decorations into the Canvas supplied to the RecyclerView. Any content drawn by this method will be drawn after the item views are drawn and will thus appear over the views.

Parameters
c Canvas to draw into
parent RecyclerView this ItemDecoration is drawing into
state The current state of RecyclerView.

public void startDrag (RecyclerView.ViewHolder viewHolder)

Starts dragging the provided ViewHolder. By default, ItemTouchHelper starts a drag when a View is long pressed. You can disable that behavior via isLongPressDragEnabled().

For this method to work:

  • The provided ViewHolder must be a child of the RecyclerView to which this ItemTouchHelper is attached.
  • ItemTouchHelper.Callback must have dragging enabled.
  • There must be a previous touch event that was reported to the ItemTouchHelper through RecyclerView's ItemTouchListener mechanism. As long as no other ItemTouchListener grabs previous events, this should work as expected.
For example, if you would like to let your user to be able to drag an Item by touching one of its descendants, you may implement it as follows:
     viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() {
         public boolean onTouch(View v, MotionEvent event) {
             if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
                 mItemTouchHelper.startDrag(viewHolder);
             }
             return false;
         }
     });
 

Parameters
viewHolder The ViewHolder to start dragging. It must be a direct child of RecyclerView.

public void startSwipe (RecyclerView.ViewHolder viewHolder)

Starts swiping the provided ViewHolder. By default, ItemTouchHelper starts swiping a View when user swipes their finger (or mouse pointer) over the View. You can disable this behavior by overriding ItemTouchHelper.Callback

For this method to work:

  • The provided ViewHolder must be a child of the RecyclerView to which this ItemTouchHelper is attached.
  • ItemTouchHelper.Callback must have swiping enabled.
  • There must be a previous touch event that was reported to the ItemTouchHelper through RecyclerView's ItemTouchListener mechanism. As long as no other ItemTouchListener grabs previous events, this should work as expected.
For example, if you would like to let your user to be able to swipe an Item by touching one of its descendants, you may implement it as follows:
     viewHolder.dragButton.setOnTouchListener(new View.OnTouchListener() {
         public boolean onTouch(View v, MotionEvent event) {
             if (MotionEventCompat.getActionMasked(event) == MotionEvent.ACTION_DOWN) {
                 mItemTouchHelper.startSwipe(viewHolder);
             }
             return false;
         }
     });
 

Parameters
viewHolder The ViewHolder to start swiping. It must be a direct child of RecyclerView.