일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 윤석열
- 2차계엄
- 레시피 파밍
- 국방부
- 원스휴먼 동물
- 원스휴먼 먹이
- 유광버섯 통조림
- 원스휴먼 사료
- 계엄령
- 원달러환율
- 원스휴먼 레시피
- 2차 비상계엄
- 일론머스크
- 계엄령 외신반응
- 원스휴먼 레시피 파밍
- 시그니처
- 비상계엄령
- 원스휴먼 쿠폰
- 원스휴먼 황금양 구하기
- 원스휴먼 요리
- 원스휴먼 스타크롬
- 1203계엄령
- 원스휴먼 황금양
- 커피추천
- 원스휴먼 황금양털파밍
- 홈플러스 시그니처 모카골드믹스커피
- 믹스커피
- 홈플러스
- 믹스커피추천
- Today
- Total
0101011001010111
[Android][Kotlin] RecyclerView Update 종류와 특징 본문
참고 블로그 : https://kadosholy.tistory.com/53
RecyclerView 업데이트 및 갱신 방법
RecyclerView의 아이템 내용이 변경되거나 아이템이 추가/이동/삭제 되었을 경우 RecyclerView에 반영하는 방법에 대해서 알아보고자 합니다.
RecyclerView를 업데이트 및 갱신 하기 위해서는 내용 변경후 어댑터에 알려주면 됩니다.
이 때 사용되는 메소드는 아이템 내용이 변경되었을때 사용하는것과 구조가 변경 되었을때 사용하는것으로 구분됩니다.
- 아이템변경 : 아이템 내용이 변경되고 위치 변경은 일어나지 않은 경우
- 구조변경 : DataSet안에서 아이템이 추가, 삭제, 이동되었을 경우
아이템 변경의 예시 : 아이템 내용이 변경되고 위치 변경은 일어나지 않은 경우
이렇게 하나의 아이템 내에서 ( 지금은 하트 클릭을 했음, 하트 모양 변경, 및 수량 변경됨)
변경 되는 것을 아이템 변경이라고 하고,
- 구조변경 : DataSet안에서 아이템이 추가, 삭제, 이동되었을 경우
구조변경은, 예를 들면 이 리스트 에서
왼쪽과같은 리스트에서 2번째가 삭제 되었다고 치자.
이게 array라고 생각해보면 0 1 2 3 4 5
0번에는 냉장고 1번에는 가방 2번에는 카드지갑 3번에 금고 4번 갤럭시 5번 프라다백
이 있었는데,
1번 가방이 삭제되면,
뒤에것들이 하나씩 옮겨져서
0번 냉장고 1번 카드지갑 2번 금고 3번 갤럭시 4번 프라다백
이런식으로 리스트 인덱스 번호가 바뀔 것이다.
이동이나, 추가 역시 인덱스 번호에 수정이 있는 것들이다.
이런것들을 구조 변경이라 한다.
그럼 , 다시 해당 블로그의 내용을 살펴보자.
RecyclerView의 데이터를 변경한 후 이를 반영하도록 어댑터에 알려주는 메소드는 아래와 같습니다.
1. 리스트의 변경 알림 메소드 종류 (요약)
[전체적으로 변경되었을 경우]
1) notifyDataSetChanged()
[아이템 내용 변경시]
2) notifyItemChanged(int)
3) notifyItemChanged(int, Object)
4) notifyItemRangeChanged(int, int)
5) notifyItemRangeChanged(int, int, Object)
[아이템 추가시]
6) notifyItemInserted(int)
7) notifyItemRangeInserted(int, int)
[아이템 이동시]
8) notifyItemMoved(int, int)
[아이템 삭제시]
9) notifyItemRemoved(int)
10) notifyItemRangeRemoved(int, int)
2. 리스트의 변경 알림 메소드 설명 (상세)
1) notifyDataSetChanged()
public final void notifyDataSetChanged()
: 사용하기는 편하나 기본적으로 변경사항에 대한 내용을 지정하지 않으므로 모든 아이템과 구조가 유효하지 않다고 가정하고 업데이트를 하므로 성능 측면에서의 효율성은 떨어진다.
2) notifyItemChanged(int)
public final void notifyItemChanged(int position)
: 아이템 한개의 내용이 변경되었을 경우 사용한다.
- position : 변경된 아이템의 위치
3) notifyItemChanged(int, Object)
public final void notifyItemChanged(int position, Object payload)
: 2번과 동일하나 payload를 옵션으로 사용할 수 있음
- position : 변경된 아이템의 위치
- payload : 옵션이며, 어댑터의 onBindViewholder()가 호출될때 넘겨받을 수 있는 객체이다. 따라서 특정 position의 내용을 payload값으로 구분하여 업데이트 할때 사용된다.
4) notifyItemRangeChanged(int, int)
public final void notifyItemRangeChanged(int positionStart, int itemCount)
: 연속된 여러개의 아이템 내용이 변경되었을 경우 사용한다.
- positionStart : 변경된 아이템의 시작 위치
- itemCount : 변경된 아이템의 갯수
5) notifyItemRangeChanged(int, int, Object)
public final void notifyItemRangeChanged(int positionStart, int itemCount, Object payload)
: 4)번과 동일하나, payload를 옵션으로 사용할 수 있음
- positionStart : 변경된 아이템의 시작 위치
- itemCount : 변경된 아이템의 갯수
- payload : 옵션이며, 어댑터의 onBindViewholder()가 호출될때 넘겨받을 수 있는 객체이다. 따라서 특정 position의 내용을 payload값으로 구분하여 업데이트 할때 사용된다.
6) notifyItemInserted(int)
public final void notifyItemInserted(int position)
: 아이템 한개를 새로 추가할 경우 사용한다.
- position : 추가된 아이템의 위치
7) notifyItemRangeInserted(int, int)
public final void notifyItemRangeInserted(int positionStart, int itemCount)
: 연속된 아이템을 추가할 경우 사용한다.
- positionStart : 추가된 아이템의 시작 위치
- itemCount : 추가된 아이템의 갯수
8) notifyItemMoved(int, int)
public final void notifyItemMoved(int fromPosition, int toPosition)
: 한개의 아이템 위치를 이동할 경우 사용한다.
- fromPosition : 기존 아이템 위치
- toPosition : 변경될 아이템 위치
9) notifyItemRemoved(int)
public final void notifyItemRemoved(int position)
: 한개의 아이템을 삭제할 경우 사용한다.
- position : 삭제할 아이템의 위치
10) notifyItemRangeRemoved(int, int)
public final void notifyItemRangeRemoved(int positionStart, int itemCount)
: 연속된 여러개의 아이템을 삭제할 경우 사용한다.
- positionStart : 삭제할 아이템의 시작 위치
- itemCount : 삭제할 아이템의 갯수
3. 리스트의 변경 알림 메소드 사용법
아이템의 내용 변경후 어댑터에 해당 메소드를 통해 알려주면 됩니다.
ex) customAdapter.notifyDataSetChanged();
4. 리스트 데이터 추가/삭제 기능 예제
앞서 작성한 기본적인 RecyclerView 사용법에서 데이터 추가/삭제 기능을 추가한 코드입니다.
이렇게 적혀있는데, 일단 왕초보인 나는 이게 무슨 의미인지 잘 모르겠다 .
하나하나 사용방법을 알아보자 !
그리고 슬프게도 해당 포스팅은 java언어를 사용하였다.
코틀린 언어로 시도해보자!!!
먼저, 포스팅 하신분은,
이렇게 리사이클러뷰에 아이템 추가와 삭제 버튼을 만드셨다.
나도 해보자 !
아이템 만들고..
recyclerview.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
android:orientation="horizontal">
<ImageView
android:id="@+id/imageView"
android:layout_width="60dp"
android:layout_height="60dp"
android:src="@mipmap/ic_launcher"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:text="text"
android:textSize="24dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/imageView"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
요건 리사이클러뷰xml메인이다!
activity_main.xml
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="8dp"
android:text="RecyclerView 테스트"
android:textSize="32dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
</androidx.constraintlayout.widget.ConstraintLayout>
자이제 어댑터를 만들어보자!
'Kotlin > [스스로]Kotlin&안드로이드' 카테고리의 다른 글
Android_ Recyclerview 만들기 (0) | 2023.09.13 |
---|---|
Android _ RecyclerView 의 Adapter (0) | 2023.09.13 |
Android - 암시적 인텐트로 다른 액티비티 실행하기 (0) | 2023.09.05 |
4-2 인텐트 연결해보기 (0) | 2023.09.05 |
Android 입문 (복습) intent (0) | 2023.09.04 |