'RecyclerView ItemTouchHelper - how to Undo or Reset swiping? Looking at how to remove background or icon
I am trying to undo the swiping (to reset background.setbounds and xmark.setbounds to 0,0,0,0) after undo is clicked on the Snackbar.
I've tried clearView or tried to introduce a boolean in onChildDraw if viewBeingCleared == true then setbounds to 0,0,0,0 but it still does not work.
How do I reset the view, or remove the red background and icon after undo is clicked?
Some help will be appreciated.
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
final int position = viewHolder.getAdapterPosition();
View view = viewHolder.itemView;
final TextView orderID = (TextView) view.findViewById(R.id.order_ID);
// showing snack bar with Undo option
Snackbar.make(view, "removed from cart!", 3000)
.addCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar1, int event) {
if (event == Snackbar.Callback.DISMISS_EVENT_TIMEOUT) {
// Snackbar closed on its own
mAdapter.deleteItem(position, orderID.getText().toString());
}
}
})
.setActionTextColor(Color.YELLOW)
.setAction("UNDO", new View.OnClickListener() {
@Override
public void onClick(View view) {
// undo is selected, restore the deleted item
//mAdapter.restoreItem(deletedItem, deletedIndex);
viewBeingCleared = true;
onClicked = true;
Log.d(TAG, "Undo clicked");
}
})
.show();
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
background.setBounds(0,0,0,0);
xMark.setBounds(0,0,0,0);
viewBeingCleared = true;
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
View itemView = viewHolder.itemView;
// not sure why, but this method get's called for viewholder that are already swiped away
if (viewHolder.getAdapterPosition() == -1) {
// not interested in those
return;
}
if (!initiated) {
init();
}
if (viewBeingCleared) {
viewBeingCleared=false;
} else {
// draw red background
background.setBounds(itemView.getRight() + (int) dX, itemView.getTop(), itemView.getRight(), itemView.getBottom());
background.draw(c);
// draw x mark
int itemHeight = itemView.getBottom() - itemView.getTop();
int intrinsicWidth = xMark.getIntrinsicWidth();
int intrinsicHeight = xMark.getIntrinsicWidth();
int xMarkLeft = itemView.getRight() - xMarkMargin - intrinsicWidth;
int xMarkRight = itemView.getRight() - xMarkMargin;
int xMarkTop = itemView.getTop() + (itemHeight - intrinsicHeight) / 2;
int xMarkBottom = xMarkTop + intrinsicHeight;
xMark.setBounds(xMarkLeft, xMarkTop, xMarkRight, xMarkBottom);
xMark.draw(c);
}
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|

