본문 바로가기
안드로이드 자바

[JAVA][Android] 리사이클러뷰 아이템 이동, 스와이프로 삭제하기

by teamnova 2021. 10. 26.

오늘은 리사이클러뷰가 만들어져 있을 때 리사이클러뷰의 아이템 위치를 이동하고 스와이프 하여 삭제하는 것을 해 보겠습니다.

1. ItemTouchHelperListener.java 클래스 만들기

스틱코드에 업로드 해 놓아 자동완성으로 언제든지 사용합니다.

스틱코드 포스팅에도 등록해 놓았으니, 사용하세요!

https://stickode.com/detail.html?no=2550 

 

스틱코드

 

stickode.com

public interface ItemTouchHelperListener {
    boolean onItemMove(int from_position , int to_position);
    void onItemSwipe(int position);
}

2. ItemTouchHelperCallback.java 클래스 만들기

스틱코드에 업로드 해 놓아 자동완성으로 언제든지 사용합니다.

스틱코드 포스팅에도 등록해 놓았으니, 사용하세요!

https://stickode.com/detail.html?no=2550

import android.util.Log;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
    private static final String TAG = "ItemTouchHelperCallback";


    private ItemTouchHelperListener listener;

    public ItemTouchHelperCallback(ItemTouchHelperListener listener) {
        this.listener = listener;
    }


    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {

        /* getMovementFlags */
        // 리사이클러뷰와 리사이클러뷰 뷰홀더를 입력받는다.
        // drag 위치와 swipe 위치를 ItemTouchHelper에서 받아 셋팅한다.
        // makeMovementFlags() 메소드로 drag위치와 swipe 위치를 입력하여 현재 위치값을 int로 반환해준다.

        int drag_flags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        int swipe_flags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(drag_flags, swipe_flags);
    }

    public boolean isLongPressDragEnabled() {
        /*isLongPressDragEnabled*/
        //  true를 반환하도록 설정하면 롱클릭을 감지한다.
        return true;
    }

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

        /* onMove */
        // 리사이클러뷰,viewHolder, target(viewHolder 중 선택된 아이템)을 입력받아 움직임을 감지한다.
        // ItemTouchHelperListener의 onItemMove 메소드로 해당 아이템의 움직임을 감지한다.
        // onItemMove 메소드는 아이템이 움직이고 있는 가를 판별하고 boolean 값으로 반환한다.

        return listener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
    }

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

        /* onSwiped */
        // 리사이클러뷰의 뷰홀더와 움직일 방향을 입력받는다.
        // ItemTouchHelperListner의 onItemSwipe 메소드에 움직일 방향을 입력하여 swipe를 구현한다.

        listener.onItemSwipe(viewHolder.getAdapterPosition());
    }
}

3. 기존에 만들어 놓은 Adapter에 ItemTouchHelperListener를 implements 한다.

4. Adapter에 onItemMove 와 onItemSwipe를 Override 한다.

스틱코드에 업로드 해 놓아 자동완성으로 언제든지 사용합니다.

스틱코드 포스팅에도 등록해 놓았으니, 사용하세요!

https://stickode.com/detail.html?no=2550 

 

스틱코드

 

stickode.com

   @Override
    public boolean onItemMove(int from_position, int to_position) {
        ChattingListDataModel number = dataModelArrayList.get(from_position); // 이동할 객체 저장
        dataModelArrayList.remove(from_position); // 이동할 객체 삭제
        dataModelArrayList.add(to_position , number); // 이동하고 싶은 position 에 추가
        notifyItemMoved(from_position,to_position); //Adapter에 데이터 이동알림
       return true;
    }

    @Override
    public void onItemSwipe(int position) {
        /*onItemSwipe*/
        //아이템의 포지션값을 받아 해당 아이템을 Swipe할때 로직을 구현
        dataModelArrayList.remove(position); // 스와이프 한 객체 삭제
        notifyItemRemoved(position); //Adapter에 데이터 이동알림
    }

 

아래와 같이 사용할 수 있습니다.

리사이클러뷰에 기능을 추가하고 싶을 때 활용하세요!