Skip to content

5.x | Drag&Drop and Swipe

Davide Steduto edited this page May 15, 2016 · 22 revisions

###In this page

  • Activation
  • Custom activation per Item Type
  • Behaviors in action
  • Swiping rear backgrounds

###Activation

//First, assign the adapter to the RecyclerView
mRecyclerView.setAdapter(mAdapter);

//Enable long press to drag items
mAdapter.setLongPressDragEnabled(true);

//Enable Swipe-To-Dismiss
mAdapter.setSwipeEnabled(true);

###Custom activation per Item Type (Not available in beta 6) There are 2 ways to customize if a specific item type is Draggable or Swipeable:

  • Using methods from item interface IFlexible or AbstractFlexibleItem: call setDraggable() and setSwipeable(), in the constructor or in the binding depends by your use case.
  • Alternatively, override the 2 methods isDraggable(), isSwipeable() inside the implementation of the FlexibleViewHolder to return always true.

By default items are NOT Draggable nor Swipeable.

###Behaviors in action Override the following methods from FlexibleViewHolder class (displaying default values):

/**
 * Allows to set elevation while the view is activated.
 * <p>Override to return desired value of elevation on this itemView.</p>
 *
 * @return never elevate, returns 0dp if not overridden
 */
public float getActivationElevation() {
	return 0f;
}

/**
 * Allows to activate the itemView when Swipe event occurs.
 * <p>This method returns always false; Extend with "return true" to Not expand or collapse
 * this ItemView onClick events.</p>
 *
 * @return always false, if not overridden
 */
protected boolean shouldActivateViewWhileSwiping() {
	return false;
}

/**
 * Allows to add and keep item selection if ActionMode is active.
 * <p>This method returns always false; Extend with "return true" to add item to the ActionMode
 * count.</p>
 *
 * @return always false, if not overridden
 */
protected boolean shouldAddSelectionInActionMode() {
	return false;
}

These 2 methods are already implemented to handle the activation/selection in combination with the ActionMode. You can override if you want more customization.

public void onActionStateChanged(int position, int actionState);
public void onItemReleased(int position);

###Swiping rear backgrounds Different background can shown by overriding the following methods of FlexibleViewHolder class:

//Inner class
static final class ViewHolder extends FlexibleViewHolder {

	...
	private View frontView;
	private View rearLeftView;
	private View rearRightView;
	
	public ViewHolder(View view, FlexibleAdapter adapter) {
		super(view, adapter);
		...
		this.frontView = view.findViewById(R.id.front_view);
		this.rearLeftView = view.findViewById(R.id.rear_left_view);
		this.rearRightView = view.findViewById(R.id.rear_right_view);
	}
	
	@Override
	public View getFrontView() {
		return frontView;//default itemView
	}
	
	@Override
	public View getRearLeftView() {
		return rearLeftView;//default null
	}
	
	@Override
	public View getRearRightView() {
		return rearRightView;//default null
	}
}

XML Layout:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:tools="http://schemas.android.com/tools"
	android:layout_width="match_parent"
	android:layout_height="?android:attr/listPreferredItemHeightLarge">

	<RelativeLayout
		android:id="@+id/front_view"
		.../>

	<RelativeLayout
		android:id="@+id/rear_left_view"
		.../>

	<RelativeLayout
		android:id="@+id/rear_right_view"
		.../>

</FrameLayout>
Clone this wiki locally