일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Android Universal Image Loader
- 운동
- FragmentPagerAdapter
- TabLayout and ViewPager
- FragmentSatePagerAdapter
- BottomNavigationViewEx
- 개발
- 목표한번이뤄보자
- 재태크
- 독서
- FrameLayout
- 2020년 목표
- overridePendingTraction
- Today
- Total
seops
[RecyclerView] 2. SimpleRecyclerView 본문
어제에 이어서, ListAdapter와 DiffUtil을 이용해 예제를 구현했다.
사실 이번 프로트를 구현하며 DiffUtil 내, 메서드가 어떻게 and 어떤 순서로 동작하는지 궁금해서 개발한 이유가 크다.
프로젝트는 간단히 아래와 같은 시나리오로 테스트 해 볼 예정이다.
1. 리스트는 총 2개가 있다.
- firstList : [ MovieItem("A", "1") ]
- secondList : [ MovieItem("A", "1"), MovieItem("B", "2") ]
2. MainActivity를 호출하면, firstList를 submitlist 해준다.
3. Add Item 버튼을 누르면, secondList를 submitlist 해준다.
4. DiffUtil.Callback 내, 오버라이드 메서드인 'areItemsTheSame'과 'areContentsTheSame'의 로그를 확인한다.
[ 소스 ]
class MovieDifferCallback : DiffUtil.ItemCallback<MovieItem>() {
// 두 객체가 같은 항목의 아이템을 표시하는지 결정한다.
override fun areItemsTheSame(oldItem: MovieItem, newItem: MovieItem): Boolean {
Log.d("seosh", "areItemsTheSame (${oldItem} / ${newItem}) : ${oldItem.title == newItem.title}")
return oldItem.title == newItem.title
}
// 두 항목의 데이터가 같은지 여부를 결정한다.
override fun areContentsTheSame(oldItem: MovieItem, newItem: MovieItem): Boolean {
Log.d("seosh", "areContentsTheSame (${oldItem} / ${newItem}) : ${oldItem == newItem}")
return oldItem == newItem
}
}
[ 로그 ]
areItemsTheSame (MovieItem(title=A, runningTime=1) / MovieItem(title=A, runningTime=1)) : true
areItemsTheSame (MovieItem(title=A, runningTime=1) / MovieItem(title=B, runningTime=2)) : false
areItemsTheSame (MovieItem(title=A, runningTime=1) / MovieItem(title=A, runningTime=1)) : true
areItemsTheSame (MovieItem(title=A, runningTime=1) / MovieItem(title=A, runningTime=1)) : true
areContentsTheSame (MovieItem(title=A, runningTime=1) / MovieItem(title=A, runningTime=1)) : true
- areItemsTheSame : 두 개체가 같은 항목의 아이템을 표시하는지 결정한다.
- areContentsTheSmae : 두 항목의 데이터가 같은지 여부를 결정한다. (areItemsTheSame이 호출된 경우만, 호출된다.)
위 로그 상에서는 (어떠한 순서로 비교가 된지는 파악이 되지 않으나, Google Docs에서 언급된 알고리즘으로 파악이 된다.) areItemsTheSame으로 초기 비교를 모두 마치고, areContentsTheSame 메서드가 호출되었다.
또한, 로그 첫번째 줄에서 동일한 아이템임을 확인했기 때문에, areContentTheSame 메서드에서 2차적으로 필터링이 진행되었음을 알 수 있다.
실제 아래와 같이 firstList와 secondList를 재구성할 경우, 2차 필터링이 됨을 확인할 수 있었고, View 또한 redraw 되는 것을 확인할 수 있었다.
- firstList : [ MovieItem("A", "1") ]
- secondList : [ MovieItem("A", "10"), MovieItem("B", "2") ]
areItemsTheSame (MovieItem(title=A, runningTime=10) / MovieItem(title=A, runningTime=1)) : true
areItemsTheSame (MovieItem(title=A, runningTime=10) / MovieItem(title=B, runningTime=2)) : false
areItemsTheSame (MovieItem(title=A, runningTime=10) / MovieItem(title=A, runningTime=1)) : true
areItemsTheSame (MovieItem(title=A, runningTime=10) / MovieItem(title=A, runningTime=1)) : true
areContentsTheSame (MovieItem(title=A, runningTime=10) / MovieItem(title=A, runningTime=1)) : false
추가로 아래 블로그에서 얻을 수 있었던 정보를 공유하려고 한다. (좋은 정보 게시 감사드립니다.)
thdev.tech/kotlin/2020/09/22/kotlin_effective_03/
data class를 활용하여 RecyclerView.DiffUtil을 잘 활용하는 방법 |
I’m an Android Developer.
thdev.tech
DiffUtil에서 == 만 사용해도 값의 체크가 가능했던 이유는, 'data class'를 이용했기 때문이다. data class의 hashcode 와 equals의 정의가 잘되어 있기 때문에 매우 간단히 비교가 가능했다고 한다.
이상으로 ListAdapter와 DiffUtil을 활용한 RecyclerView를 마치려고 한다. 테스트를 진행했던 코드는, 아래 Github을 통해 확인할 수 있다.
github.com/Seops34/SimpleRecyclerView
Seops34/SimpleRecyclerView
Contribute to Seops34/SimpleRecyclerView development by creating an account on GitHub.
github.com
오늘은 여기까지~ :)
'Android > Android' 카테고리의 다른 글
[RxJava] 01. Basic Concepts for RxJava (0) | 2020.11.18 |
---|---|
[RecyclerView] Compare RecyclerView with ListView (1) | 2020.10.31 |
[RecyclerView] 1. RecyclerView and DiffUtil (0) | 2020.10.20 |
[Callback] 2. Singleton Class (0) | 2020.10.12 |
[Callback] 1. SimpleCallback (0) | 2020.10.07 |