소근소근

리사이클러뷰(RecyclerView) 스와이프(swipe)로 아이템 이동 및 삭제 구현[AndroidStudio-JAVA] 본문

AndroidStudio

리사이클러뷰(RecyclerView) 스와이프(swipe)로 아이템 이동 및 삭제 구현[AndroidStudio-JAVA]

JJureng 2021. 7. 5. 20:44
728x90
반응형
SMALL

1. ItemTouchHelperListener.java (interface)

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

2. ItemTouchHelperCallback.java  

public class ItemTouchHelperCallback extends ItemTouchHelper.Callback {
    private ItemTouchHelperListener listener;

    public ItemTouchHelperCallback(ItemTouchHelperListener listener){
        this.listener = listener;
    }
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
        int drag_flags = ItemTouchHelper.UP|ItemTouchHelper.DOWN;
        int swipe_flags = ItemTouchHelper.START|ItemTouchHelper.END;
        return makeMovementFlags(drag_flags, swipe_flags);
    }

    public boolean isLongPressDragEnabled(){
        return true;
    }

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

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        listener.onItemSwipe(viewHolder.getAdapterPosition());
    }
}

 

3. 리사이클러 어댑터 클래스 ItemTouchHelperListener를 implement한다

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> implements ItemTouchHelperListener {

    @Override
    public boolean onItemMove(int from_position, int to_position) {
        String number = list.get(from_position);
        list.remove(from_position);
        list.add(to_position , number);

        notifyItemMoved(from_position,to_position);
        return true;
    }

    @Override
    public void onItemSwipe(int position) {
        String number = numbook.get(position);

        list.remove(position);

        notifyItemRemoved(position);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder{
    }

    @NonNull
    @Override
    public RecyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerAdapter.MyViewHolder holder, int position) {

    }

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

}

onItemMove는 위치를 옮기는 함수이다.

원래 포지션의 데이터를 저장해놓고, 그 위치의 값을 지운다. 나중 포지션에 해당 데이터를 add해주고

notifyItemMoved를 호출한다.

onItemSwipe는 오른쪽(혹은 왼쪽)으로 스와이프하면 해당 아이템이 삭제되도록한다.

remove로 해당 데이터를 지우고 notifyItemMoved를 호출한다.

 

4. 마지막으로는 Mainactivity에 

ItemTouchHelper helper;
helper = new ItemTouchHelper(new ItemTouchHelperCallback(adapter));
helper.attachToRecyclerView(rv);

추가해주면 되는데 코드에 따라 다르다.

내 코드의 경우 리사이클러뷰가 fragment에 있어서 fragment class의 onCreatView에서 추가해주었다.

 

public class phone extends Fragment {
	PhoneAdapter adapter;
    ItemTouchHelper helper;
    private RecyclerView recyclerView;
    
    public phone(){

    }
    public phone(ArrayList<String> numbook , ArrayList<String> namebook , ArrayList<Bitmap> photobook){
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    private void setAdapter() {

    }
    @Nullable
    @Override
    public View onCreateView(@Nullable LayoutInflater inflater, @Nullable  ViewGroup container,
                            @Nullable Bundle savedInstanceState) {
        ViewGroup v = (ViewGroup)inflater.inflate(R.layout.fragment_phone, container, false);
        recyclerView = v.findViewById(R.id.phone_recycler);

        setAdapter();

        helper = new ItemTouchHelper(new ItemTouchHelperCallback(adapter));
        helper.attachToRecyclerView(recyclerView);

        return v;
    }
}

fragment 의 경우엔 이런식으로 작성하면 된다.

 

728x90
반응형
LIST