이전 시간에 이어서 이번에는 리스트 목록 중에
삭제하고 싶은 항목을 옆으로 밀어서 삭제하는
방법에 대해서 알아보겠습니다.
이전 시간에 이어서 하기 때문에 이전 게시물을
보지 않으신 분들은 이전 게시물을 먼저
보시면 됩니다.
2022.01.01 - [안드로이드] - [안드로이드] RecyclerView item animation 서서히 나타나는 효과 주는 방법
2022.01.02 - [안드로이드] - [안드로이드] RecyclerView Animation 스크롤(Scroll)에 애니메이션 효과 주는 방법
1. 실행화면
2. recyclerView 스와이프(Swipe) 라이브러리 등록
3. ItemAdapter 수정
4. 메인 코드 스와이프 기능 구현 MainActivity.java
build.gradle(Module:프로젝트명:app)
dependencies 괄호 안에 아래 코드를 넣어주시면 됩니다.
implementation 'com.github.xabaras:RecyclerViewSwipeDecorator:1.4'
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-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();
}
});
}
}
아이콘
2021.12.30 - [안드로이드] - [안드로이드] transition으로 액티비티(Activity) 변경 애니메이션 효과 주는 방법
2021.12.29 - [안드로이드] - [안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 회전표시 애니메이션
2021.12.28 - [안드로이드] - [안드로이드] 애니메이션으로 뷰(View) 표시 및 숨기기 - 카드플립(CardFlip)
[안드로이드] 테이블 모양 그리드뷰(GridView) 쉽게 만드는 방법 (0) | 2022.01.05 |
---|---|
[안드로이드] RecyclerView Item Animation 왼쪽, 오른쪽, 위, 아래 방향별로 효과 주는 방법 (0) | 2022.01.04 |
[안드로이드] RecyclerView Animation 스크롤(Scroll) 에 애니메이션 효과주는 방법 (2) | 2022.01.02 |
[안드로이드] RecyclerView Item Animation 서서히 나타나는 효과 주는 방법 (0) | 2022.01.01 |
[안드로이드 스튜디오] 애니메이션(Animation) 폴더 및 파일 생성하는 방법 (0) | 2022.01.01 |
댓글 영역