I got this working with:
ItemTouchHelper.Callback itemTouchCallback = new ItemTouchHelper.Callback() {
private boolean swipeBack = false;
private boolean hitMax = false;
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
if (viewHolder instanceof LocationsDetailAdapter.LocationsDetailViewHolder) {
int swipeFlags = ItemTouchHelper.END;
return makeMovementFlags(0, swipeFlags);
} else
return 0;
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return true;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
hitMax = false;
getDefaultUIUtil().clearView(((LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder).getForeground());
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
if (viewHolder != null) {
getDefaultUIUtil().onSelected(((LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder).getForeground());
}
}
@SuppressLint("ClickableViewAccessibility")
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
recyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) {
swipeBack = true;
} else {
swipeBack = false;
}
return false;
}
});
if(dX >= 150f) {
dX = 150f;
if (!hitMax) {
setCardFavorite(arrayLockers.get(viewHolder.getAdapterPosition()), (LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder);
}
hitMax = true;
}
getDefaultUIUtil().onDraw(c, recyclerView, ((LocationsDetailAdapter.LocationsDetailViewHolder) viewHolder).getForeground(), dX, dY, actionState, isCurrentlyActive);
}
@Override
public int convertToAbsoluteDirection(int flags, int layoutDirection) {
return swipeBack ? 0 : super.convertToAbsoluteDirection(flags, layoutDirection);
}
};
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(itemTouchCallback);
itemTouchHelper.attachToRecyclerView(recyclerView);
return view;
}
public void setCardFavorite(Locker locker, LocationsDetailAdapter.LocationsDetailViewHolder holder){
final RelativeLayout background_selected = holder.getBackground_selected();
final CardView card = holder.getLocationDetailCard();
Animator anim;
if(!locker.isFavorite()){
anim = ViewAnimationUtils.createCircularReveal(background_selected, 75, 75, 0, (float) Math.hypot(background_selected.getWidth(), background_selected.getHeight()));
background_selected.setVisibility(View.VISIBLE);
final float scale = getResources().getDisplayMetrics().density;
int pixels = (int) (getResources().getDimension(R.dimen.spacing_small) * scale + 0.5f);
ViewGroup.MarginLayoutParams layoutParams =
(ViewGroup.MarginLayoutParams) card.getLayoutParams();
layoutParams.setMargins(pixels, 0, 0, 0);
card.requestLayout();
locker.setFavorite(true);
Toast.makeText(getContext(), "Adicionou a fechadura aos favoritos!", Toast.LENGTH_SHORT).show();
anim.setDuration(1000);
} else {
anim = ViewAnimationUtils.createCircularReveal(background_selected, 75, 75, (float) Math.hypot(background_selected.getWidth(), background_selected.getHeight()), 0);
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
background_selected.setVisibility(View.INVISIBLE);
}
});
ViewGroup.MarginLayoutParams layoutParams =
(ViewGroup.MarginLayoutParams) card.getLayoutParams();
layoutParams.setMargins(0, 0, 0, 0);
card.requestLayout();
locker.setFavorite(false);
Toast.makeText(getContext(), "Removeu a fechadura dos favoritos!", Toast.LENGTH_SHORT).show();
anim.setDuration(300);
}
anim.start();
}