일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 안드로이드
- 안드로이드 익명클래스
- #안드로이드 개발자 #안드로이드 신입 #개발자 이직 #안드로이드 면접 #신입 개발자
- retrofi
- #리사이클러뷰
- retrofit
- #안드로이드
- 키스토어
- 제플린
- 클린아키텍쳐
- retrofit2
- #SMS API #안드로이드 SMS #SMS Retriever
- MVVM
- #ContentProvider #App DataShare
- #리사이클러뷰 어댑터
- 레트로핏
- 사용법
- 리사이클러뷰 체크박스
- zeplin
- 구글맵안돼요
- 안드로이드 메모리릭
- 빗버킷 #bitbucket #authorization failed #깃
- #android #안드로이드 #glide #gif #이미지다운로드
- 안드로이드 아키텍쳐
- 메모리릭
- 안드로이드해상도
Archives
- Today
- Total
땀이 삐질삐질 나는 개발 일기
안드로이드 RecyclerView Item Delete 본문
이전 시간에는 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;
}
}
}
}
'개발 Tip' 카테고리의 다른 글
다른 앱과 Data Share하는 방법 Feat. ContentProvider (0) | 2019.05.17 |
---|---|
여러개의 EditText의 String 값을 깔끔하게 Null & Empty 검사하는 방법 (0) | 2019.05.16 |
RecyclerView 와 Retrofit2를 사용해 영화 목록 얻어오기 (0) | 2019.04.11 |
LinkedTreeMap 을 DTO로 변환 시 발생하는 문제 (1) | 2019.03.21 |
SMS Retriever API 사용 (0) | 2019.03.12 |
Comments