# DiffUtil

18개의 포스트

ListAdapter 사용법

ListAdapter란? RecyclerView의 어댑터 인터페이스입니다. ListAdapter는 RecyclerView.Adapter를 상속받습니다. 기본적인 데이터 변경 관리를 쉽게 처리할 수 있는 특수한 유형의 어댑터입니다. ListAdapter는 Diffutil 클래스와 결합하여 데이터 변경 사항을 비교하고 최소한의 업데이트만 수행하여 성능을 향상시킵니다. ListAdapter를 사용하면 데이터의 변경 사항을 자동으로 감지하고 해당 변경 사항에 대한 업데이트를 수행할 수 있습니다. 이는 데이터 소스가 변경될 때마다 RecyclerView에 대한 전체 데이터 세트를 다시 설정하지 않고도 효율적인 업데이트를 수행할 수 있다는 장점이 있습니다. ListAdapter는 이전 데이터와 새 데이터 간의 차이를 계산하여 새로운 항목을 삽입, 제거 도는 업데이트하고 애니메이션 효과를 적용할 수 있도록 도와줍니다. ListAdapter에 사용되는 DiffUt

2023년 7월 17일
·
0개의 댓글
·

Android[kotlin] - ListAdapter, DiffUtil

Adapter의 역할 > 데이터를 받아오고 이를 레이아웃에 직접 연결하는 함수를 실행시키는 클래스 > = ListView나 App의 특정 데이터와 RecyclerView의 view를 Bind하는 것을 도와준다. > * 미리 생성해둔 뷰홀더 객체에 사용자가 원하는 데이터 리스트를 주입하고 데이터 리스트에 변경사항이 있을 때 이를 UI에 반영한다. 하지만 기존에 를 사용하면 리스트 내의 데이터가 바뀌면 리스트 전체가 바뀌었음 -> 지연 시간 발생(Flickering Issue) 이런 현상을 막고자 DiffUtil 이 나왔다. DiffUtil > 두 목록 간의 차이를 계산하고 첫 번째 목록을 두 번째 목록으로 변환하는 업데이트 작업 목록을 출력하는 유틸리티 클래스 RecyclerView 어댑터의 업데이트를 계산하는 데 사용할 수 있다. ListAdapter를 통해 백그라운드 Thread에서 DiffUtil 사용을 단순화할 수 있다. >

2023년 3월 28일
·
0개의 댓글
·
post-thumbnail

[Android] DiffUtil 자세히 봐보기

공부한 내용을 정리한 글 입니다. 잘못된 내용이 있다면 댓글로 알려주세요! DiffUtil 살펴보기 리사이클러뷰를 구현하며 한번 쯤은 사용해봤던 DiffUtil 클래스에 대해 자세히 알아봅시다. > DiffUtil is a utility class that calculates the difference between two lists and outputs a list of update operations that converts the first list into the second one. > DiffUtil은 두 리스트 간의 차이를 계산하고 첫 번째 리스트를 두 번째 리스트로 변환하는 업데이트 작업 목록을 출력하는 유틸리티 클래스입니다. (https://developer.android.com/reference/androidx/recyclerview/widget/DiffUtil) DiffUtil은 첫번째 리스트에 어떤 연산(제거, 이동, 변환 등)

2023년 2월 5일
·
0개의 댓글
·
post-thumbnail

RecyclerView에 DiffUtil을 사용해 보자

RecyclerView에 데이터가 변화될 때? RecyclerView를 사용하다 데이터의 변화가 있을 때 리스트를 업데이트하는 5가지 방법이 있다. > notifyDataSetChanged - 리스트 전체 업데이트 > notifyItemChanged, notifyItemRangeChanged - 특정 범위의 아이템만 변경 > notifyItemInserted, notifyItemRangeInserted - 특정 위치에 아이템 새로 추가 > notifyItemRemoved, notifyItemRangeRemoved - 특정 범의의 아이템 삭제 > notifyItemMoved - 아이템 위치 이동 위의 기능들을 활용하여 RecyclerView를 유용하게 사용할 수 있다. 하지만 notifyDataSetChanged같은 경우는 리스트를 전부 지우고 처음부터 하나씩 view를 만들기 때문에 리소스가 굉장

2023년 2월 3일
·
0개의 댓글
·

[Android] RecyclerView DiffUtil 3. - ListAdapter

Why ListAdapter 의 Async를 좀더 간편하게 사용하기 위해! +) adapter에서 별도의 업데이트 함수를 만들어주지 않아도 밖에서 submitlist를 통해 업데이트 가능 사용 ListAdapter 상속 DiffItemCallback 선언 getItem

2022년 7월 26일
·
0개의 댓글
·

[Android] RecyclerView DiffUtil 1. - Basic

DiffUtil이 뭔가요? recyclerView 를 사용할 때 리스트에 변경이 있을 시 notifyDataSetChanged() 를 사용하여 리스트를 업데이트 하였다. 하지만 이는 이전 리스트를 새 리스트로 바뀌는 작업으로 데이터 하나만 바뀌더라도 모든 리스트가 새로 생성되고 그려지는 매우 비효율적인 메서드 이다. 이 비효율적인 작업을 해결하기 위해 RecyclerView에 DiffUtil 클래스 가 존재한다. 이 클래스는 Eugene W. Myers's difference algorithm을 이용하여 두 리스트 간의 최소한의 업데이트 수를 찾는다. 그리고 찾은 데이터들에 대해서 RecyclerView 는 업데이트를 진행하면 된다. 알고리즘 성능 또한 알고리즘 성능은 O(N + D^2)이 된

2022년 6월 27일
·
0개의 댓글
·
post-thumbnail

[Android/Kotlin] Header가 있는 Recyclerview에 ListAdapter 적용하기 (DiffUtil, AsyncListDiffer)

💌 [안드로이드/코틀린] Header가 있는 Recyclerview에 ListAdapter 적용하기 (DiffUtil, AsyncListDiffer) 리사이클러뷰를 구현하고 찾아보던 중 notifyDataSetChanged() 를 남발하면 불필요한 데이터 교체가 일어나 성능 저하가 일어난다는 사실을 알게 되었다 그래서 DiffUtil을 통해 성능을 개선할 수 있도록 기존 리사이클러뷰 어댑터를 수정해보았다 📌 DiffUtil 란? > DiffUtil은 두 목록의 차이를 계산하고 첫 번째 목록을 두 번째 목록으로 변환하는 업데이트 작업 목록을 출력하는 유틸리티 클래스입니다. RecyclerView 어댑터에 대한 업데이트를 계산하는 데 사용할 수 있습니다. 하지만 목록이 크면 이 작업에 상당한 시간이 걸릴 수 있으므로 AsyncListDiffer 를 이용하여 백그라운드 스레드에서 실행하는 것이 좋다 📌 ListAdapter 란? > - 백그라운드 스레

2022년 5월 25일
·
0개의 댓글
·
post-thumbnail

[Android] RecyclerView, ViewHolder 패턴, DiffUtil 클래스란?

RecyclerView   예전 안드로이드 개발 시에 리스트 형태로 데이터를 표현해주는데 사용되는 클래스는 ListView 였습니다. 하지만 데이터의 크기가 커질수록 뷰를 생성함으로써 메모리 부족 현상이 발생하게 되고 getView 메소드에서는 계속된 findViewById를 사용하였기에 비효율적이었습니다. 이를 개선한 위젯이 RecyclerView로 화면이 보여지는 뷰까지만 생성한 후 스크롤 시에 가려지게 되는 뷰들로 재사용하여 새로운 뷰들을 보여줍니다. 또한, RecyclerView는 findViewById의 값 비싼 비용을 방지하고자 ViewHolder 패턴을 강제화 시킨 ListView라고 볼 수도 있습니다. ViewHolder 패턴이란? > ViewHolder 패턴을 이해하기 위해서는 ViewHolder 패턴이 왜 필요한지부터 이해하면 좋습니다. ListAdapter의 문제점   위의 코드는 ListView의 어댑터인 Lis

2022년 5월 8일
·
0개의 댓글
·

[Android] AsyncListDiffer와 ListAdapter

이전 글에서 DiffUtil을 이용하여 RecyclerView를 update하는 방법을 알아보았습니다. 이번에는 DiffUtil.calculateDiff를 이용하여 background thread에서 차이를 계산하고 main thread에서 RecyclerView를 update시켜주는 AsyncListDiffer와 wrapper 클래스인 ListAdapter에 대해 알아보겠습니다. ListAdapter ListAdapter은 RecyclerView.Adapter를 상속받습니다. 사용자가 정의한DiffUtil.ItemCallback을 이용하여 AsyncListDiffer 객체를 생성하여 field로 가지고 있는것을 볼 수 있습니다. AsyncListDiffer > Helper for computing the difference betwe

2022년 4월 19일
·
0개의 댓글
·

[Android] DiffUtil

RecyclerView를 사용할 때, 리스트가 update되어 RecyclerView에 반영해야할 때, 흔히 쓰는 method는 notifyDataSetChanged()입니다. notifyDataSetChanged()의 경우 쓰기는 간편하지만 성능에 좋지 않은 영향을 미치게 됩니다. notifyDataSetChanged의 문제점 현재 adapter를 가지고 있는 모든 RecyclerView에게 전체 리스트의 데이터가 변경되었다고 알리고 모든 아이템들을 다시 binding하게 됩니다. 즉, 리스트의 데이터 중 일부만 변경되어서 반영해야할 경우 notifyDataSetChanged를 사용하게 되면 필요 이상의 성능을 낭비하게 됩니다. 이런 일을 방지하기 위해서는 notifyDataSetChanged()가 아닌 변경된 데이터만 update 시켜주는 notifyItemChanged(position), notifyItemInserted(position) 등을 이용하여야 합니

2022년 4월 19일
·
0개의 댓글
·
post-thumbnail

Git Diff / Android DiffUtil Deep Dive - 1

Android Recyclerview Adapter 에서 리스트 간 갱신에 사용되는 DiffUtil 에서는 클래스 내부에 정의된 calculateDiff 함수) 를 이용해 new, old list 의 diff 를 찾아내고, Git 에서는 diff 라는 명령어를 이용해 파일 간 내용을 비교하여 선택적으로 변경사항을 저장하고 기존 작업 복사본과 병합할 수 있는 기능을 가지고 있다. 이 둘은 내부적으로 동일한 알고리즘(Myers' diff Algorithm 논문) 을 사용한다. 이 게시물에서는 diff 알고리즘이 어떻게 동작하는지에 대해 논문 내 그

2022년 4월 10일
·
3개의 댓글
·
post-thumbnail

[안드로이드] diffUtil을 사용하여 리사이클러뷰 데이터를 자동으로 갱신시키자

아직도 notifyDataSetChanged() 를 사용하시나요? 기존 리사이클러뷰 어댑터의 문제점 기존에는 데이터의 변경이 이루어질 때마다 notifyDataSetChanged()를 사용하곤 했습니다. 이는 일부 데이터의 변경사항을 처리하기 위해 뷰를 다시 그려 변경사항을 처리하는 메서드입니다. 만약 데이터가 1000개 있고, 하나의 데이터를 삭제하고 notifyDataSetChanged()를 사용하게 된다면 999개의 리스트를 다시 그리는 것이 되는거죠. 물론 한 아이템의 내용을 업데이트 하려면 notifyItemChanged()를 사용하시면 됩니다. 이는 position을 인자로 받아서 해당 위치의 데이터 변경을 알리는 메서드니까요. 그러나 너무 번거롭지 않나요? 데이터를 추가, 삭제를 하려면 notifyDataSetChanged()를 사용하고, 데이터 내용만 변경할 때에는 notifyItemChanged()를

2022년 3월 5일
·
0개의 댓글
·
post-thumbnail

[안드로이드/코틀린] DiffUtil 구현시 === 사용에 대한 고찰

서론 이전에는 RecyclerView의 뷰홀더 갱신이 필요하면 notifyDataSetChanged를 호출해서 전체를 갱신하곤 했다. 하지만 불필요하게 안바꿔도 되는 아이템을 다시 해줘야하고, 무엇보다도 깜빡임이 심해지는 경험을 하였다. 하지만 DiffUtil이라는 클래스의 내부 추상 클래스인 ItemCallback을 가져온 후 내부 추상메서드를 오버라이드해서 구현을 함으로써 최적화를 이루어 낼 수 있었다. DiffUtil areItemsTheSame와 areContentsTheSame은 뷰홀더 갱신 유무를 정해주는데 areItemsTheSame에서 만약 ViewHolder1 { a = 1 } ViewHolder2 { a = 2 } ViewHolder3 { a = 3 } 이렇게 화면에 출력이 되었고, ViewHolder1의 모델에서 a 변수가 11로 변경되어 화면에 출력을 해야한다고 했을때, 뷰홀더 3개를 전부 갱신하는게 아니라 ViewHolder1만 변경시켜 줄 수

2022년 1월 24일
·
0개의 댓글
·
post-thumbnail

From DiffUtil To ListAdapter

배경 기존의 리사이클러뷰를 사용할 때에는 리스트가 바뀔때마다 데이터를 업데이트 해야 했다. 예를들면 리스트의 아이템을 삭제하거나 추가할때마다 notifyDataSetChanged()를 통하여 리사이클러뷰에게 데이터 변화를 알려주고 리스트의 전체를 업데이트하고 바뀐 데이터들을 가져와 리사이클러뷰를 통해 보여주었다. 하지만 이런 과정에서 지연이 길어지고, 목록의 내용이 변경되는 동안의 비용이 많이 들었다. 데이터를 새로 가져오기 위해서 adapter는 새로운 item 인스턴스를 만들어주어야 하기 때문이다. 이를 해결하기 위해 DiffUtil이 나왔다. DiffUtil RecyclerView의 Support Library에 포함된 유틸리티 클래스이다. 이 클래스는 두 목록간의 차이점을 찾고 업데이트 되어야 할 목록을 반환시켜준다. Eugiene W.Myeers's의 차이 알고리즘을 이용하여 업데이트 수를 계산한다. DiffUtil 사용을 위해서는 바뀌기 전 후의

2021년 12월 7일
·
0개의 댓글
·
post-thumbnail

[Android/kotlin] RecyclerView ListAdapter + Diffutil

ListAdapter란? 기본적으로 RecyclerView를 사용하기 위해서는 Adapter, LayoutManager, ViewHolder가 필요한데 Adapter는 데이터 리스트를 실제 눈으로 볼 수 있게 item으로 변환하는 중간다리 역할을 한다. 기존에 notifyDataSetChanged()를 통해 데이터를 업데이트하면 조금만 바뀌어도 나머지 데이터도 모두 업데이트되는 불필요함이 있었는데 ListAdapter를 사용하게되면 백그라운드 스레드에서 DiffUtil를 통해 불필요한 교체 비용을 줄일 수 있다. > DiffUtil RecyclerView의 성능을 개선할 수 있게 해주는 유틸리티 클래스로 현제 데이터 리스트와 교체될 리스트를 비교해서 무엇이 바뀌었는지 비교해서 바뀐 부분의 데이터만 바꿔준다. > AsyncListDiffer DiffUtil을 더 편리하게 사용할 수 있게 해주는 클래스다. 백그

2021년 11월 24일
·
0개의 댓글
·

안드로이드 RecyclerView DiffUtil 사용하기

DiffUtil 란? RecyclerView 에 보여줄 두 가지 리스트 간의 차이를 비교해서 달라진 부분만 업데이트 하도록 도와주는 유틸리티 클래스이다! 이게 왜 필요할까 싶지만, RecyclerView 에서 데이터를 변경하고 나서 보통은 notifyDatasetChanged() 를 호출해 RecyclerView 를 다시 그린다. ▶️ cost 가 굉장히 높은 작업이다! (보여줄 목록이 수백개라면..? 어느 세월에 다 그럴거니..?) ▶️ 바뀐 부분만 딱딱 캐치해서 업데이트하는 DiffUtil 이 등장하게 된 것! AsyncListDiffer 두 리스트간의 차이를 비교할 때, 백그라운드 스레드에서 비교하도록 도와주는 헬퍼 클래스이다. 이걸 바로 쓰기보다는 ListAdapter 라는 wrapper 클래스를 활용해 더 간편하게 쓸 수 있다! ListAda

2021년 11월 12일
·
0개의 댓글
·
post-thumbnail

[Android] DiffUtil 사용법 알아보기

DiffUtil 의 등장 배경 안드로이드 앱을 개발하다보면 필수적으로 쓰이는 RecyclerView 사용에 있어서, 동적으로 데이터가 변경되는 경우 우리는 notifyDataSetChanged() 한 줄로 리사이클러뷰를 갱신하곤 했다. 만약 아이템 딱 하나가 바뀌는 상황이더라도 귀찮아서 notifyDataSetChanged() 를 통해 갱신하곤 한다. 그러나 이러한 행위는 성능에 치명적인 악영향을 미치게 된다. 그야말로 멍청한 짓이다 (사실 필자 이야기다). 사실 개발자한텐 너무너무 편하다. notifyDataSetChanged() 는 사실상 리스트를 싹 지우고 다시 처음부터 끝까지 객체를 하나하나 만들어 새로 렌더링하는 과정을 거치게 된다. 때문에 비용이 매우 크게 발생한다. 따라서 효율적으로 동적인 리사이클러뷰를 구성하는 방법이 필요했다. 이러한 이유로 등장한 것이 바로 DiffUtil

2021년 10월 31일
·
1개의 댓글
·

안드로이드에서 Kotlin으로 recyclerView diffUtil 구현하기

notifyDataSetChanged()보다 더 효율적으로 작업하기 위한 DiffUtil() 클래스. diffUtil class 만들기 DiffCallback.kt recyclerView adapter에서 diffUtil 사용하기 RecyclerViewAdapter.kt 에서 setData라는 함수를 통해 diffUtil 사용 MainActivity.kt에서 diffUtil 사용해보기

2021년 8월 31일
·
0개의 댓글
·