0101011001010111

[Android][Kotlin] RecyclerView Update 종류와 특징 본문

Kotlin/[스스로]Kotlin&안드로이드

[Android][Kotlin] RecyclerView Update 종류와 특징

[진주] 2023. 9. 13. 21:02
728x90
반응형

참고 블로그 : 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>

 

자이제 어댑터를 만들어보자! 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형