-
-
Save keinix/b1aa2417dbea9311a1207eddf8b9d47b to your computer and use it in GitHub Desktop.
package io.keinix.protoflow.util; | |
import android.graphics.Canvas; | |
import android.graphics.Color; | |
import android.graphics.drawable.ColorDrawable; | |
import android.graphics.drawable.Drawable; | |
import android.support.v4.content.ContextCompat; | |
import android.support.v7.widget.RecyclerView; | |
import android.support.v7.widget.helper.ItemTouchHelper; | |
import android.view.View; | |
import io.keinix.protoflow.R; | |
import io.keinix.protoflow.tasks.TasksAdapter; | |
public class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback { | |
private TasksAdapter mAdapter; | |
private Drawable icon; | |
private final ColorDrawable background; | |
public SwipeToDeleteCallback(MyAdapter adapter) { | |
super(0,ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT); | |
mAdapter = adapter; | |
icon = ContextCompat.getDrawable(mAdapter.getContext(), | |
R.drawable.ic_delete_white_36); | |
background = new ColorDrawable(Color.RED); | |
} | |
@Override | |
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) { | |
// used for up and down movements | |
return false; | |
} | |
@Override | |
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) { | |
int position = viewHolder.getAdapterPosition(); | |
mAdapter.deleteTask(position); | |
} | |
@Override | |
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) { | |
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); | |
View itemView = viewHolder.itemView; | |
int backgroundCornerOffset = 20; //so background is behind the rounded corners of itemView | |
int iconMargin = (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; | |
int iconTop = itemView.getTop() + (itemView.getHeight() - icon.getIntrinsicHeight()) / 2; | |
int iconBottom = iconTop + icon.getIntrinsicHeight(); | |
if (dX > 0) { // Swiping to the right | |
int iconLeft = itemView.getLeft() + iconMargin + icon.getIntrinsicWidth(); | |
int iconRight = itemView.getLeft() + iconMargin; | |
icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); | |
background.setBounds(itemView.getLeft(), itemView.getTop(), | |
itemView.getLeft() + ((int) dX) + backgroundCornerOffset, itemView.getBottom()); | |
} else if (dX < 0) { // Swiping to the left | |
int iconLeft = itemView.getRight() - iconMargin - icon.getIntrinsicWidth(); | |
int iconRight = itemView.getRight() - iconMargin; | |
icon.setBounds(iconLeft, iconTop, iconRight, iconBottom); | |
background.setBounds(itemView.getRight() + ((int) dX) - backgroundCornerOffset, | |
itemView.getTop(), itemView.getRight(), itemView.getBottom()); | |
} else { // view is unSwiped | |
background.setBounds(0, 0, 0, 0); | |
} | |
background.draw(c); | |
icon.draw(c); | |
} | |
} |
Hi,
there is a bug on this for left to right swipe
line 55 and 56 should be
int iconLeft = itemView.getLeft() + iconMargin;
int iconRight = itemView.getLeft() + iconMargin + icon.getIntrinsicWidth();
Hi,
there is a bug on this for left to right swipeline 55 and 56 should be
int iconLeft = itemView.getLeft() + iconMargin;
int iconRight = itemView.getLeft() + iconMargin + icon.getIntrinsicWidth();
Thank you! That saved my day :)
My problem was that the icon not disappeared after the user cancelled the swipe.
This solved my problem:
} else { // view is unSwiped
icon.setBounds(0, 0, 0, 0); // ADD THIS LINE
background.setBounds(0, 0, 0, 0);
}
Can you provide a link to the TaskAdapter code and coordinator_layout.xml. Thanks
My problem was that the icon not disappeared after the user cancelled the swipe.
This solved my problem:} else { // view is unSwiped icon.setBounds(0, 0, 0, 0); // ADD THIS LINE background.setBounds(0, 0, 0, 0); }
or you just don't draw it
for me, Icon does not show. icon.draw(c)
is not working
@ZaccharieBOUVY you're welcome.
thanks man!
Code leaves the bloody trash can in the middle of the row if the user doesn't complete the swipe!