상세 컨텐츠

본문 제목

[안드로이드] RecyclerView 스와이프(Swiped) 옆으로 밀어서 삭제하는 방법

안드로이드

by aries574 2022. 1. 3. 16:14

본문


이전 시간에 이어서 이번에는 리스트 목록 중에

삭제하고 싶은 항목을 옆으로 밀어서 삭제하는

방법에 대해서 알아보겠습니다.

이전 시간에 이어서 하기 때문에 이전 게시물을

보지 않으신 분들은 이전 게시물을 먼저

보시면 됩니다.

2022.01.01 - [안드로이드] - [안드로이드] RecyclerView item animation 서서히 나타나는 효과 주는 방법

 

[안드로이드] RecyclerView item animation 서서히 나타나는 효과 주는 방법

이번 시간에는 리스트로 데이터를 보여줄 때 사용하는 RecyclerView에 애니메이션(Animation)을 적용시켜 서서히 리스트가 보여지는 방법을 알아보겠습니다. 목차 1. Item 클래스 만들기 Item.java 2. It

aries574.tistory.com

2022.01.02 - [안드로이드] - [안드로이드] RecyclerView Animation 스크롤(Scroll)에 애니메이션 효과 주는 방법

 

[안드로이드] RecyclerView Animation 스크롤(Scroll) 에 애니메이션 효과주는 방법

이전 시간에 조회 시 RecyclerView에 아이템(Item)들이 위에서 쏟아지듯 나타나는 애니메이션 효과 주는 방법에 대해 알아 보았습니다. 이번 시간에는 이어서 스크롤(Scroll)을 내릴 때에도 애니메이션

aries574.tistory.com


목차

1. 실행화면

2. recyclerView 스와이프(Swipe) 라이브러리 등록

3. ItemAdapter 수정

4. 메인 코드 스와이프 기능 구현 MainActivity.java


1. 실행화면

 

 

2. recyclerView 스와이프(Swipe) 라이브러리 등록

build.gradle(Module:프로젝트명:app)

dependencies 괄호 안에 아래 코드를 넣어주시면 됩니다.

implementation 'com.github.xabaras:RecyclerViewSwipeDecorator:1.4'

 

 

3. ItemAdapter 수정

3-1 추가된 부분

    /**
     * 아이템 추가
     * @param position 등록 위치
     * @param item 아이템
     */
    public void addItem(int position, Item item){

        items.add(position, item);
    }

    /**
     * 아이템 삭제
     * @param position 삭제 위치
     */
    public void removeItem(int position){

        items.remove(position);
    }

3-2 전체 소스

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder>{

    ArrayList<Item> items = new ArrayList<Item>();

    Context context;

    int lastPosition = -1;

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {

        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());
        View itemView = inflater.inflate(R.layout.item_layout, viewGroup, false);

        context = viewGroup.getContext();

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder viewHolder, int position) {

        if(viewHolder.getAdapterPosition() > lastPosition){

            Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_in_row);
            ((ViewHolder) viewHolder).itemView.startAnimation(animation);

            Item item = items.get(position);
            viewHolder.setItem(item);
        }
    }

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



    public void addItem(Item item){

        items.add(item);
    }

    /**
     * 아이템 추가
     * @param position 등록 위치
     * @param item 아이템
     */
    public void addItem(int position, Item item){

        items.add(position, item);
    }

    /**
     * 아이템 삭제
     * @param position 삭제 위치
     */
    public void removeItem(int position){

        items.remove(position);
    }

    public void removeAllItem(){
        items.clear();
    }



    static class ViewHolder extends RecyclerView.ViewHolder{

        TextView title_view;
        TextView description;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            title_view = itemView.findViewById(R.id.title_text);
            description = itemView.findViewById(R.id.desc_text);
        }

        public void setItem(Item item){

            title_view.setText(item.getTitle());
            description.setText(item.getDescription());
        }
    }
}

 

 

4. 메인 코드 스와이프 기능 구현 MainActivity.java

4-1 추가된 부분

rrayList<Item> items = new ArrayList<Item>();
items.add(item);
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            @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) {

                int position = viewHolder.getAdapterPosition();

                switch(direction){

                    case ItemTouchHelper.LEFT:

                        //삭제할 아이템 담아두기
                        Item deleteItem = items.get(position);

                        //삭제 기능
                        items.remove(position);
                        itemAdapter.removeItem(position);
                        itemAdapter.notifyItemRemoved(position);

                        //복구 기능
                        Snackbar.make(recyclerView, deleteItem.getTitle(), Snackbar.LENGTH_LONG)
                                .setAction("복구", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {

                                        items.add(position, deleteItem);
                                        itemAdapter.addItem(position, deleteItem);
                                        itemAdapter.notifyItemInserted(position);
                                    }
                                }).show();
                        break;
                }
            }

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

                new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder,
                        dX, dY, actionState, isCurrentlyActive)
                        .addSwipeLeftBackgroundColor(Color.RED)
                        .addSwipeLeftActionIcon(R.drawable.ic_delete)
                        .addSwipeLeftLabel("삭제")
                        .setSwipeLeftLabelColor(Color.WHITE)
                        .create()
                        .decorate();

                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        }).attachToRecyclerView(recyclerView);

 

4-2 전체 소스

설명

onSwiped: 스와이프 기능 구현

onChildDraw: 스와이프 속성 설정

addSwipeLeftBackgroundColor: 스와이프 왼쪽 시 바탕화면 설정

addSwipeLeftActionIcon: 스와이프 왼쪽 시 아이콘 설정

addSwipeLeftLabel: 스와이프 왼쪽 시 문구 설정

setSwipeLeftLabelColor: 스와이프 왼쪽 시 문구 색상 설정

public class MainActivity extends FragmentActivity {

    RecyclerView recyclerView;
    ItemAdapter itemAdapter;

    ArrayList<Item> items = new ArrayList<Item>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        recyclerView = findViewById(R.id.recycler_view);

        itemAdapter = new ItemAdapter();
        recyclerView.setAdapter(itemAdapter);

        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
            @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) {

                int position = viewHolder.getAdapterPosition();

                switch(direction){

                    case ItemTouchHelper.LEFT:

                        //삭제할 아이템 담아두기
                        Item deleteItem = items.get(position);

                        //삭제 기능
                        items.remove(position);
                        itemAdapter.removeItem(position);
                        itemAdapter.notifyItemRemoved(position);

                        //복구 기능
                        Snackbar.make(recyclerView, deleteItem.getTitle(), Snackbar.LENGTH_LONG)
                                .setAction("복구", new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {

                                        items.add(position, deleteItem);
                                        itemAdapter.addItem(position, deleteItem);
                                        itemAdapter.notifyItemInserted(position);
                                    }
                                }).show();
                        break;
                }
            }

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

                new RecyclerViewSwipeDecorator.Builder(c, recyclerView, viewHolder,
                        dX, dY, actionState, isCurrentlyActive)
                        .addSwipeLeftBackgroundColor(Color.RED)
                        .addSwipeLeftActionIcon(R.drawable.ic_delete)
                        .addSwipeLeftLabel("삭제")
                        .setSwipeLeftLabelColor(Color.WHITE)
                        .create()
                        .decorate();

                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
            }
        }).attachToRecyclerView(recyclerView);


        Button search_btn = findViewById(R.id.search_btn);
        search_btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //조회 전 화면 클리어
                itemAdapter.removeAllItem();

                //샘플데이터 생성
                for(int i = 0; i < 10; i++){

                    Item item = new Item();
                    item.setTitle("title"+i);
                    item.setDescription("description"+i);

                    //데이터 등록
                    items.add(item);
                    itemAdapter.addItem(item);
                }

                //적용
                itemAdapter.notifyDataSetChanged();

                //애니메이션 실행
                recyclerView.startLayoutAnimation();
            }
        });
    }
}

아이콘

ic_delete.xml
0.00MB

 

 

2021.12.30 - [안드로이드] - [안드로이드] transition으로 액티비티(Activity) 변경 애니메이션 효과 주는 방법

 

[안드로이드] transition으로 액티비티(Activity) 변경 애니메이션 효과 주는 방법

이번 시간에는 애니메이션을 통해 액티비티(Activity) 변경 애니메이션 효과 주는 방법을 알아보겠습니다. 목차 1. 새로운 액티비티 추가 2. 새로운 액티비티 화면 구성 3. 새로운 액티비티 코드 구

aries574.tistory.com

2021.12.29 - [안드로이드] - [안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 회전표시 애니메이션

 

[안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 회전표시 애니메이션

이번 시간에는 애니메이션을 통해 텍스트뷰가 퍼지듯이 나타났다가 퍼지듯이 사라지는 예제를 만들어 보려고 합니다. 1. 메인 화면 구성 activity_main.xml 화면은 간단합니다. 프레임 레이아웃(Fr

aries574.tistory.com

2021.12.28 - [안드로이드] - [안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 카드플립(CardFlip)

 

[안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 카드플립(CardFlip)

이번 시간에는 애니메이션을 통해 2개의 이미지가 뒤집히며 교체되는 모습을 만들어보겠습니다. 목차 1. 메인 화면 구성 activity_main.xml 2. 애니메이션 만들기 2-1 애니메이션 폴더 만드는 방법 2-2

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역