Im Batman
Im Batman

Reputation: 1876

Disable ItemTouchHelper Swipe for some rows in RecyclerView

I'm simply using following methods to do the Right and Left swipe on my Data list.and it works fine. and I want to know how to disable swipe action for some rows in the data list. ex: there is some data user should not be able delete. I want to restrict those rows.

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


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

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

            //Remove swiped item from the list and notify the RecyclerView

        }
        @Override
        public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {

        }
    };

Upvotes: 5

Views: 4338

Answers (2)

Cheticamp
Cheticamp

Reputation: 62831

Use getMovementFlags() of your ItemTouchHelper.SimpleCallback. You would need to detect the view holders for which you want to disallow swiping by not returning swipe flags.

Here is a sample of where swiping is disallowed for a grid layout.

  @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        // Set movement flags based on the layout manager
        if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            final int swipeFlags = 0;
            return makeMovementFlags(dragFlags, swipeFlags);
        } else {
            final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
            final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
            return makeMovementFlags(dragFlags, swipeFlags);
        }
}

Upvotes: 16

Im Batman
Im Batman

Reputation: 1876

i want to disable swipe where object Marked Type not equal to 1

 @Override
        public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            final int position = viewHolder.getAdapterPosition();

            int sectionIndex = listAdapter.getSectionForAdapterPosition(position);
            int itemIndex = listAdapter.getPositionOfItemInSection(sectionIndex, position);

            myModelObject temp = filteredArrayList.get(sectionIndex).get(itemIndex);

            if(!temp.getMarkedType().equals("1")){
                return 0;
            }

            return super.getSwipeDirs(recyclerView, viewHolder);
        }

Upvotes: 3

Related Questions