# ListAdapter
[TIL] 230912 회고
Intro > 저번주 팀과제 진행후 오늘부터 ViewModel과 LiveData를 공부중에있다. 그리고 이것들은 ListAdapter를 통하여 RecyclerView에서 보여질 데이터를 처리한다. 공부하면서 아직 해결하지못한 문제와 새롭게 알게된 것을 정리해보려고 한다. ListAdapter 기존에 사용하던 RecyclerView Adapter와 차이점은 바로 직접 List의 업데이트를 신경쓰지 않는다는 것이다. 이것은 DiffUtil이라는 안드로이드팀에서 제공하는 비교 알고리듬을 통해 기존 리스트와 새로운 리스트 내부 데이터 차이를 비교하여 바뀐부분만 업데이트 해준다. 사용해보니 무엇보다 코드가 간결해진다는 큰 장점이 있었다. ViewModel 일반적으로 ViewModel이라는 단어는 MVVM 패턴에서 보이는 단어이다. 어느 블로그 글을보니 MS에서 만든 MVVM은 View와 Data의 결합도를 낮춰 가독성좋고 유지보수하기 편한 구조를 만들기
ListAdapter 사용법
ListAdapter란? RecyclerView의 어댑터 인터페이스입니다. ListAdapter는 RecyclerView.Adapter를 상속받습니다. 기본적인 데이터 변경 관리를 쉽게 처리할 수 있는 특수한 유형의 어댑터입니다. ListAdapter는 Diffutil 클래스와 결합하여 데이터 변경 사항을 비교하고 최소한의 업데이트만 수행하여 성능을 향상시킵니다. ListAdapter를 사용하면 데이터의 변경 사항을 자동으로 감지하고 해당 변경 사항에 대한 업데이트를 수행할 수 있습니다. 이는 데이터 소스가 변경될 때마다 RecyclerView에 대한 전체 데이터 세트를 다시 설정하지 않고도 효율적인 업데이트를 수행할 수 있다는 장점이 있습니다. ListAdapter는 이전 데이터와 새 데이터 간의 차이를 계산하여 새로운 항목을 삽입, 제거 도는 업데이트하고 애니메이션 효과를 적용할 수 있도록 도와줍니다. ListAdapter에 사용되는 DiffUt

TIL) 230404
Dao 쿼리에서 Kotlin 값 참조하기 위 데이터 클래스에서 컬럼이 스네이크 케이스로 명명되어있지만, 코틀린에서는 카멜 케이스로 명명하기 때문에 @ColumnInfo 주석을 활용해 이름을 지정했다. 그리고 Dao 쿼리에서 값을 참조하기 위해 :를 사용한다. ViewModelFactory ViewModelFactory는 ViewModel 인스턴스를 생성하는 데 사용되는 클래스다. ViewModelProvider를 사용하여 ViewModel 인스턴스를 만들고 관리한다. ViewModelFactory는 ViewModel의 인스턴스화를 위해 필요한 데이터 또는 객체를 전달할 수 있도록 도와준다. 그래서 ViewModel이 생성될 때마다 인스턴스화해야 하는 클래스 또는 데이터가 있을 때 유용하다. 예를 들어 ViewModelFactory를 사용하여 데이터베이스 인스턴스를 ViewModel에 전달하면 ViewModel은 데이터
Android[kotlin] - ListAdapter, DiffUtil
Adapter의 역할 > 데이터를 받아오고 이를 레이아웃에 직접 연결하는 함수를 실행시키는 클래스 > = ListView나 App의 특정 데이터와 RecyclerView의 view를 Bind하는 것을 도와준다. > * 미리 생성해둔 뷰홀더 객체에 사용자가 원하는 데이터 리스트를 주입하고 데이터 리스트에 변경사항이 있을 때 이를 UI에 반영한다. 하지만 기존에 를 사용하면 리스트 내의 데이터가 바뀌면 리스트 전체가 바뀌었음 -> 지연 시간 발생(Flickering Issue) 이런 현상을 막고자 DiffUtil 이 나왔다. DiffUtil > 두 목록 간의 차이를 계산하고 첫 번째 목록을 두 번째 목록으로 변환하는 업데이트 작업 목록을 출력하는 유틸리티 클래스 RecyclerView 어댑터의 업데이트를 계산하는 데 사용할 수 있다. ListAdapter를 통해 백그라운드 Thread에서 DiffUtil 사용을 단순화할 수 있다. >
[Android][Kotlin] RecyclerView에서 Adapter와 ListAdapter의 차이점
RecyclerView는 안드로이드 앱에서 목록을 표시할 때 자주 사용되는 유연한 뷰 구조입니다. 이 글에서는 RecyclerView를 사용할 때 선택할 수 있는 두 가지 어댑터 유형, 즉 기본 RecyclerView.Adapter와 확장된 ListAdapter에 대해 알아보겠습니다. RecyclerView.Adapter 기본 RecyclerView.Adapter는 데이터를 관리하고 뷰 홀더를 바인딩하기 위한 기본 클래스입니다. RecyclerView.Adapter를 사용할 때 데이터 변경 사항을 처리하려면 아래와 같은 메서드를 수동으로 호출해야 합니다. notifyDataSetChanged() notifyItemChanged() notifyItemInserted() 그 외의 다양한 notify 메서드들 또한 데이터 항목에 대한 동일성 및 내용 동일성을 수동으로 처리해야 합니다. 코드예제 : FoodListAdapter.kt ListAda
ListView에서 RecyclerView를 지나 ListAdapter까지
노션으로 깔끔 하게 원본 보기  adapter에서 별도의 업데이트 함수를 만들어주지 않아도 밖에서 submitlist를 통해 업데이트 가능 사용 ListAdapter 상속 DiffItemCallback 선언 getItem

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

[Android] ListAdapter
Adapter의 역할 RecyclerView에 보여줄 데이터 리스트 관리 View 객체를 재사용하기 위한 ViewHolder 객체 생성 데이터 리스트에서 position에 해당되는 데이터를 itemView에 표시 RecyclerView에서 ListAdapter를 사용하는 이유는 대부분의 경우 RecyclerView의 데이터는 동적으로 변경됩니다. 그러면 왜 ListAdapter를 사용할까? 이에 대한 설명은 예시로 설명하겠습니다. 예시 메모 작업의 동작으로 설명을 한다면 새 작업을 추가하고 삭제하는 과정을 실행한다면 목록에서 새로운 작업들이 추가되고 삭제되어야한다. 데이터를 지정된 위치에 저장해주는 notifyiteminserted() 메서드를 사용하여 추가를 해 줄 수 있지만 문제는 요소의 삭제에서 문제가 된다. 코드가 매우 복잡하고 까다로워 많은 사람들은 notifyDataSetChanged()를 호출한다. 하지만 이 방법
[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

ListAdapter 를 사용 중 UI 업데이트가 되지 않는 현상 | 삽질 노트
😡 문제 상황 ListAdapter를 사용 중 submitList()를 통해 새로운 데이터를 넣어도 실시간 데이터 업데이트가 되지 않는다. 🤔 원인 파악 기본적으로 DiffUtill은 areItemsTheSame 에서 true를 반환해야 areContentsTheSame 메소드를 실행하고, 거기서 false를 반환하면 데이터가 변경되었다고 판단, UI 업데이트가 이루어진다. 이를 활용하여, oldItem 의 내용과 newItem 의 내용을 로그에 담아 비교해보기로 했다. 코드는 아래와 같다. 
From DiffUtil To ListAdapter
배경 기존의 리사이클러뷰를 사용할 때에는 리스트가 바뀔때마다 데이터를 업데이트 해야 했다. 예를들면 리스트의 아이템을 삭제하거나 추가할때마다 notifyDataSetChanged()를 통하여 리사이클러뷰에게 데이터 변화를 알려주고 리스트의 전체를 업데이트하고 바뀐 데이터들을 가져와 리사이클러뷰를 통해 보여주었다. 하지만 이런 과정에서 지연이 길어지고, 목록의 내용이 변경되는 동안의 비용이 많이 들었다. 데이터를 새로 가져오기 위해서 adapter는 새로운 item 인스턴스를 만들어주어야 하기 때문이다. 이를 해결하기 위해 DiffUtil이 나왔다. DiffUtil RecyclerView의 Support Library에 포함된 유틸리티 클래스이다. 이 클래스는 두 목록간의 차이점을 찾고 업데이트 되어야 할 목록을 반환시켜준다. Eugiene W.Myeers's의 차이 알고리즘을 이용하여 업데이트 수를 계산한다. DiffUtil 사용을 위해서는 바뀌기 전 후의
[Android/kotlin] RecyclerView ListAdapter + Diffutil
ListAdapter란? 기본적으로 RecyclerView를 사용하기 위해서는 Adapter, LayoutManager, ViewHolder가 필요한데 Adapter는 데이터 리스트를 실제 눈으로 볼 수 있게 item으로 변환하는 중간다리 역할을 한다. 기존에 notifyDataSetChanged()를 통해 데이터를 업데이트하면 조금만 바뀌어도 나머지 데이터도 모두 업데이트되는 불필요함이 있었는데 ListAdapter를 사용하게되면 백그라운드 스레드에서 DiffUtil를 통해 불필요한 교체 비용을 줄일 수 있다. > DiffUtil RecyclerView의 성능을 개선할 수 있게 해주는 유틸리티 클래스로 현제 데이터 리스트와 교체될 리스트를 비교해서 무엇이 바뀌었는지 비교해서 바뀐 부분의 데이터만 바꿔준다. > AsyncListDiffer DiffUtil을 더 편리하게 사용할 수 있게 해주는 클래스다. 백그
RecyclerView ListAdapter를 통한 DiffUtil 사용법
https://seokzoo.tistory.com/3 로 이전했습니다!
[Android/Kotlin] RecyclerView에서 ListAdapter +DiffUtil 사용해보기
Adapter의 역할 > 데이터를 받아오고 이를 레이아웃에 직접 연결하는 함수를 실행시키는 클래스 = ListView나 App의 특정 데이터와 RecyclerView의 view를 Bind하는 것을 도와준다 RecyclerViewAdapter 같은 경우, 전체 리스트를 통째로 업데이트해야 할때 100개의 아이템들이 있다면 100개가 모두 업데이트된다. 그런데 안바뀌는 항목이 더 많다면..? 비효율적이다 -> 그래서 DiffUtil 이 있다 DiffUtil > 기존 리스트와 업데이트 된 리스트의 차이를 계산하고 실제로 변환할 리스트 아이템들의 결과를 반환하는 유틸리티 클래스 주로 RecyclerView Adpater의 업데이트를 계산하는데 사용되고 ListAdapter에서 DiffUtil을 활용해서 차이점을 계산한다. DiffUtil 사용법 > DiffUtil.Callback 이라는 기능을 구현해야 한다! ListAdapter? > 간단히 말해서, Dif