Search code examples
androidandroid-recyclerviewitemtouchhelper

Undo swipe in recycler view on pressing back button?


How to restore the swiped view on pressing back button in recyclerView ?

MY CODE

RecyclerListAdapter.java

public class RecyclerListAdapter extends RecyclerView.Adapter<RecyclerListAdapter.ItemViewHolder>
        implements ItemTouchHelperAdapter {


    private final List<Card> mItems = new ArrayList<>();

    Card car1 = new Card(R.drawable.card1, "Text First");
    Card car2 = new Card(R.drawable.card1, "Text Second");
    Card car3 = new Card(R.drawable.card3, "Text First");
    Card car4 = new Card(R.drawable.card4, "Text Second");
    Card car5 = new Card(R.drawable.card3, "Text First");
    Card car6 = new Card(R.drawable.card2, "Text Second");

    public RecyclerListAdapter() {
        mItems.addAll(Arrays.asList(car1, car2,car3,car4,car5,car6));
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card, parent, false);
        ItemViewHolder itemViewHolder = new ItemViewHolder(view);
        return itemViewHolder;
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        final Card card = mItems.get(position);
        holder.textView.setText(card.getText());
        holder.imageView.setImageResource(card.getImage());

    }

    @Override
    public void onItemDismiss(int position) {

        mItems.remove(position);
        notifyItemRemoved(position);
    }

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        Card prev = mItems.remove(fromPosition);
        mItems.add(toPosition > fromPosition ? toPosition - 1 : toPosition, prev);
        notifyItemMoved(fromPosition, toPosition);
    }

    @Override
    public int getItemCount() {
        return mItems.size();
    }


    public static class ItemViewHolder extends RecyclerView.ViewHolder implements
            ItemTouchHelperViewHolder {

        public final TextView textView;
        public final ImageView imageView;

        public ItemViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.heading_text);
            imageView= (ImageView)itemView.findViewById(R.id.image);

        }

        @Override
        public void onItemSelected() {
            itemView.setBackgroundColor(Color.LTGRAY);
        }

        @Override
        public void onItemClear() {
            itemView.setBackgroundColor(0);
        }
    }
}

SimpleItemTouchHelperCallback.java

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {

    private final ItemTouchHelperAdapter mAdapter;

    public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter mAdapter) {
        this.mAdapter = mAdapter;
    }

    @Override
    public boolean isLongPressDragEnabled() {
        return false;
    }

    @Override
    public boolean isItemViewSwipeEnabled() {
        return true;
    }


    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        int dragFlags = 0;
        int swipeFlags = ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        mAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return true;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        mAdapter.onItemDismiss(viewHolder.getAdapterPosition());

    }


    public void onSelectedChange(RecyclerView.ViewHolder viewHolder, int actionstate) {
        if (actionstate != ItemTouchHelper.ACTION_STATE_IDLE) {
            ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
            itemViewHolder.onItemSelected();
        }
        super.onSelectedChanged(viewHolder, actionstate);
    }
    @Override
    public void clearView(RecyclerView recyclerView,RecyclerView.ViewHolder viewHolder){
        super.clearView(recyclerView,viewHolder);

        ItemTouchHelperViewHolder itemViewHolder =  (ItemTouchHelperViewHolder) viewHolder;
        itemViewHolder.onItemClear();
    }
}

ItemTouchHelperAdapter.java

public interface ItemTouchHelperAdapter {
void onItemMove(int fromPosition, int toPosition);
void onItemDismiss(int position);
}

ItemTouchHelperViewHolder.java

public interface ItemTouchHelperViewHolder {
 void onItemSelected();
   void onItemClear();

}

Everything works fine but i need to know how to get the swiped view back on pressing back button.


Solution

  • In your OnItemDismiss method, save a copy of the item you are removing then just create an OnItemRestore method that places it back in the adapter.

    Call the new method from the OnBackPressed method of the Activity

    private Object lastRemovedItem;
    private int lastIndex=-1;
    
    @Override
    public void onItemDismiss(int position) {
    
        lastRemovedItem=mItems.get(position);
        lastindex=position;
    
        mItems.remove(position);
        notifyItemRemoved(position);
    }
    
    public void restoreLastItem(){
       if (lastIndex==-1) return;
       mItems.add(lastindex,lastRemovedItem);
       notifyItemInserted(lastIndex);
       lastRemovedItem=null;
       lastIndex=-1;
    }