简体   繁体   中英

RecyclerView swipe without deleting an item

I want to do some action on swipe in RecyclerView. I use ItemTouchHelper.SimpleCallback for that purpose.

But when I do a swipe, an item disappears from my RecyclerView.

How do I fix that? I want to show some swiping animation and call onSwiped() callback without removing an item.

val simpleItemTouchCallback = object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
    override fun onMove(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder, target: RecyclerView.ViewHolder): Boolean {
        return false
    }

    override fun onSwiped(viewHolder: RecyclerView.ViewHolder, swipeDir: Int) {
        val position = viewHolder.adapterPosition
        val item = (recyclerView.adapter as DashboardAdapter).getItem(position)

        if (swipeDir == ItemTouchHelper.LEFT) {
            // Close query
            ...

        } else if (swipeDir == ItemTouchHelper.RIGHT) {
            // Take query
            ...
        }

        recyclerView.adapter?.notifyDataSetChanged()
    }
}

val itemTouchHelper = ItemTouchHelper(simpleItemTouchCallback)
itemTouchHelper.attachToRecyclerView(recyclerView)

You can do that with adding to ViewHolder field which will have information about if is view swipeable, and on method onSwiped set that to false, and animate item to orginal x with method translationX(0), you can use too transaltionY(0) if you are swiping vertical too. IF YOU DO THAT ITEM WILL NOT BE SWIPEABLE AGAIN

   private ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        Log.e("Swiped","Swiped");
        ((YourViewHolder) viewHolder).setSwipeable(false);
        View item = viewHolder.itemView;
        item.animate().translationX(0);
    }

    @Override
    public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        if(((RemarkAdapter.RemarkViewHolder) viewHolder).isSwipeable()){
            return super.getSwipeDirs(recyclerView, viewHolder);
        }
        else{
            return 0;
        }
    }

};

Try capturing the data before it's removed and insert it back in the same position after swipe action is done.

So, let's say you have stored arrays of strings in a recyclerView :

//your array
ArrayList<String> names = new ArrayList();

//an array we will need later to store deleted name
ArrayList<String> deleted_names = new ArrayList();

names.add("inno");
names.add("anna");
names.add("john");

//your recyclerViewAdapter
recyclerAdapter = new RecyclerAdapter(names,this);
recyclerView.setAdapter(recyclerAdapter);

private ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new 
ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) 
{

@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull 
RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
    return false;
}

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) 
{
    Log.e("Swiped","Swiped");
    int position = viewHolder.getLayoutPosition();

    if (direction == ItemTouchHelper.RIGHT) {
        deleted_names = names.get(position);

        names.remove(position);
        recyclerAdapter.notifyItemRemoved(position);

        names.add(position,deleted_names);
        recyclerAdapter.notifyItemInserted(position);
    }
   
}

@Override
public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull 
RecyclerView.ViewHolder viewHolder) {
    if(((RemarkAdapter.RemarkViewHolder) viewHolder).isSwipeable()){
        return super.getSwipeDirs(recyclerView, viewHolder);
    }
    else{
        return 0;
    }
 }

};

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM