개발 Tip
안드로이드 RecyclerView Item Delete
삐질
2019. 4. 21. 23:05
이전 시간에는 Item ADD에 대해 알아보았다면 이번엔 Delete에 대해 알아봅시다.
Delete를 하는 것에 있어서 가장 중요한 부분은
리사이클러뷰는 View 와 Data 부를 따로 생각하셔야 한다는 것 입니다.
이게 무슨소리냐?
리사이클러뷰의 아이템 리스트를 Set 하고 그것을 onBindViewHolder 에서 내가 지정 한 Item View에 Data Set을 해 줄것인데 ,
실제로 내가 ItemList의 특정 리스트는 지웠어도 , View는 변경이 되지 않습니다. 이유는 View를 다시 그려줘야하기 때문인데요
( 한 마디로 Data와 View의 동기화 작업 )
아래 코드로 보시죠.
플로우는 아래와 같습니다.
준비물 : ItemEntity( 아이템 리스트) , Recyclerview , MainActivity
- ItemEntity는 내가 리스트에 나타내주고 싶은 Item의 타이틀과 / 체크여부를 기억하는 Data Entity입니다.
MainActivity.java
public class ItemAdapter extends RecyclerView.Adapter {
private Context context;
private List<ItemEntity> itemList;
public ItemAdapter(Context context, List<ItemEntity> itemList) {
this.context = context;
this.itemList = itemList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) { //홀더 타입 검사
ItemEntity itemEntity = itemList.get(position);
((ItemViewHolder) holder).title.setText(itemEntity.getTitle());
Log.e("타이틀", "" + itemEntity.getTitle());
if (itemEntity.isClicked()) { //이 조건문 쌍이 매우 중요함 반드시 true / false 각 반대의 상황 모두의 view 상태를 set 해줘야함
((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_24px);
} else { //그렇지 않으면, 어떤일이 벌어지는 지는 본인이 테스트해보시면 참 좋을 것으로 예상됨.
((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_outline_24px);
}
}
}
@Override
public int getItemCount() {
return itemList.size(); //아이템리스트가 null 이면 사이즈는 0 반환 / 아니면 사이즈만큼 반환
}
public List<ItemEntity> getItemList() {
return itemList;
}
public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView title;
private Button click;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.text_title);
click = itemView.findViewById(R.id.check_btn);
click.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.check_btn:
boolean isClicked = itemList.get(getAdapterPosition()).isClicked();
itemList.get(getAdapterPosition()).setClicked(!isClicked);
notifyItemChanged(getAdapterPosition());
break;
}
}
}
}
ItemEntity.java
public class ItemEntity {
private String title;
private boolean isClicked;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isClicked() {
return isClicked;
}
public void setClicked(boolean clicked) {
isClicked = clicked;
}
ItemAdapter.java
public class ItemAdapter extends RecyclerView.Adapter {
private Context context;
private List itemList;
public ItemAdapter(Context context, List itemList) {
this.context = context;
this.itemList = itemList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview, parent, false);
return new ItemViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if (holder instanceof ItemViewHolder) { //홀더 타입 검사
ItemEntity itemEntity = itemList.get(position);
((ItemViewHolder) holder).title.setText(itemEntity.getTitle());
Log.e("타이틀", "" + itemEntity.getTitle());
if (itemEntity.isClicked()) { //이 조건문 쌍이 매우 중요함 반드시 true / false 각 반대의 상황 모두의 view 상태를 set 해줘야함
((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_24px);
} else { //그렇지 않으면, 어떤일이 벌어지는 지는 본인이 테스트해보시면 참 좋을 것으로 예상됨.
((ItemViewHolder) holder).click.setBackgroundResource(R.drawable.ic_baseline_check_circle_outline_24px);
}
}
}
@Override
public int getItemCount() {
return itemList.size(); //아이템리스트가 null 이면 사이즈는 0 반환 / 아니면 사이즈만큼 반환
}
public List getItemList() {
return itemList;
}
public class ItemViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView title;
private Button click;
public ItemViewHolder(@NonNull View itemView) {
super(itemView);
title = itemView.findViewById(R.id.text_title);
click = itemView.findViewById(R.id.check_btn);
click.setOnClickListener(this);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.check_btn:
boolean isClicked = itemList.get(getAdapterPosition()).isClicked();
itemList.get(getAdapterPosition()).setClicked(!isClicked);
notifyItemChanged(getAdapterPosition());
break;
}
}
}
}