Slide 1

Slide 1 text

ERIC COCHRAN MAKE LISTS MAGICAL WITH RECYCLERVIEW'S ITEMTOUCHHELPER @ERIC_COCHRAN DROIDCON SF MARCH 17, 2016

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

LISTVIEW ANIMATION FUN ViewTreeObserver, setTransientState, …

Slide 4

Slide 4 text

RECYCLERVIEW: THE SAVIOR

Slide 5

Slide 5 text

OnItemTouchListener public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e); public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) ItemDecoration public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)

Slide 6

Slide 6 text

ItemTouchHelper • SUPPLY CALLBACK • ATTACH TO RECYCLERVIEW

Slide 7

Slide 7 text

ItemTouchHelper.Callback public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction)

Slide 8

Slide 8 text

ItemTouchHelper.Callback public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) int makeMovementFlags(int dragFlags, int swipeFlags) • COMPOSES DRAG AND SWIPE FLAGS. • AS SIMPLE AS: @Override
 public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
 int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
 int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
 return makeMovementFlags(dragFlags, swipeFlags);
 }

Slide 9

Slide 9 text

ItemTouchHelper.Callback • DRAG AND DROP! • REMEMBER TO UPDATE DATA AND NOTIFY ADAPTER. • AS SIMPLE AS: @Override public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
 // update data here!
 adapter.notifyItemMoved(viewHolder.getAdapterPosition(),
 target.getAdapterPosition()); // notify adapter.
 return true;
 } public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)

Slide 10

Slide 10 text

ItemTouchHelper.Callback SUPPORTING DRAGGING @Override public boolean isLongPressDragEnabled() {
 return true;
 } OR itemTouchHelper.startDrag(myDraggingViewHolder); public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)

Slide 11

Slide 11 text

ItemTouchHelper.Callback SUPPORTING DRAGGING AND DROPPING: QUICK TIP @Override
 public boolean canDropOver(RecyclerView recyclerView, RecyclerView.ViewHolder current,
 RecyclerView.ViewHolder target) {
 return true; // maybe a header View or other circumstance to be false.
 } public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target)

Slide 12

Slide 12 text

ItemTouchHelper.Callback • SWIPE! • REMEMBER TO UPDATE DATA AND NOTIFY ADAPTER. • DIRECTION IS VERY USEFUL. • AS SIMPLE AS: @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
 // update data here!
 adapter.notifyItemRemoved(viewHolder.getAdapterPosition()); // notify adapter.
 } public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction)

Slide 13

Slide 13 text

ItemTouchHelper.Callback SUPPORTING SWIPING @Override public boolean isItemViewSwipeEnabled() {
 return super.isItemViewSwipeEnabled();
 } OR itemTouchHelper.startSwipe(mySwipingViewHolder); public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction)

Slide 14

Slide 14 text

Easiest common custom animations • THESE TWO METHODS ARE NIFTY. • ACTIONSTATE: IDLE, SWIPE, OR DRAG @Override public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
 super.onSelectedChanged(viewHolder, actionState);
 // Fun with viewHolder's Views!
 // Example:
 viewHolder.itemView.animate()
 .scaleX(1.5f)
 .scaleY(1.5f)
 .setDuration(250L)
 .start();
 }
 
 @Override
 public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
 super.clearView(recyclerView, viewHolder);
 // Example:
 viewHolder.itemView.animate()
 .scaleX(1f)
 .scaleY(1f)
 .setDuration(250L)
 .start();
 }

Slide 15

Slide 15 text

Customize More public long getAnimationDuration(RecyclerView recyclerView, int animationType, float animateDx, float animateDy);
 
 public float getSwipeThreshold(RecyclerView.ViewHolder viewHolder)
 
 public float getMoveThreshold(RecyclerView.ViewHolder viewHolder);
 
 public float getSwipeEscapeVelocity(float defaultValue);
 
 public float getSwipeVelocityThreshold(float defaultValue);
 
 public int getBoundingBoxMargin();

Slide 16

Slide 16 text

ITEMTOUCHHELPER IS AN ITEMDECORATION public void onChildDraw(Canvas c, RecyclerView recyclerView,
 RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
 boolean isCurrentlyActive);
 
 public void onChildDrawOver(Canvas c, RecyclerView recyclerView,
 RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
 boolean isCurrentlyActive); WITH SOME MORE HELP

Slide 17

Slide 17 text

ITEMTOUCHHELPER IS AN ITEMDECORATION @Override public void onChildDraw(Canvas c, RecyclerView recyclerView,
 RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
 boolean isCurrentlyActive) {
 if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
 int width = viewHolder.itemView.getWidth();
 float alpha = 1.0f - Math.abs(dX) / width;
 viewHolder.itemView.setAlpha(alpha);
 }
 super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
 } WITH SOME MORE HELP SIMPLE FADING EXAMPLE:

Slide 18

Slide 18 text

FOR CUSTOM LAYOUTMANAGERS Implement ViewDropHandler, and ItemTouchHelper will give you prepareForDrop calls automatically from onMoved!

Slide 19

Slide 19 text

MAKE MAGICAL EXPERIENCES TTThanks