# DiffUtil?
ListAdapter์ ์์ฑ์๋ก ๋ค์ด๊ฐ์ผํ๋ ๊ฐ์ฒด๋ค.
@SuppressWarnings("unused")
protected ListAdapter(@NonNull DiffUtil.ItemCallback<T> diffCallback) {
mDiffer = new AsyncListDiffer<>(new AdapterListUpdateCallback(this),
new AsyncDifferConfig.Builder<>(diffCallback).build());
mDiffer.addListListener(mListener);
}
@SuppressWarnings("unused")
protected ListAdapter(@NonNull AsyncDifferConfig<T> config) {
mDiffer = new AsyncListDiffer<>(new AdapterListUpdateCallback(this), config);
mDiffer.addListListener(mListener);
}
๋ฆฌ์คํธ์ ์ฃผ์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์์ดํ ๊ฐ์ฒด๋ฅผ ๋น๊ตํ๋ ํด๋์ค๋ค.
companion object {
val diffUtil = object : DiffUtil.ItemCallback<T>() {
override fun areItemsTheSame(oldItem: T, newItem: T): Boolean {
return oldItem == newItem
}
override fun areContentsTheSame(oldItem: T, newItem: T): Boolean {
return oldItem == newItem
}
}
}
๊ธฐ๋ณธ ํ์ด๋ค.
์์ดํ ์ ๋ด์ฉ์ด ๊ฐ์์ง ํ์ธํ๊ณ , ์ฃผ์๊ฐ์ด ๊ฐ์์ง ํ์ธํ๋ค.(Object.equals(Object))
diffUtil์ ๋ง๋ค ๋, class๋ก ๋ง๋ค์ง, object๋ก ๋ง๋ค์ง, companion object๋ก ๋ง๋ค์ง ๊ณ ๋ฏผํ๋๋ฐ companion object๋ก ์์ฑํ๋ ๊ฒ ์ข๋ค๊ณ ํ๋ค. ์๋๋ก์ด๋์์ ์ด๋ํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ฉด diffUtil๋ ์ฌ์ฉ๋๊ฒ ๋๋๋ฐ ์ด ๊ฒฝ์ฐ companion object๋ก ์ ์ธํ๋ฉด ํด๋์ค ์ธ์คํด์ค์ ์๋ช ์ฃผ๊ธฐ์ ์๊ด์์ด ํด๋์ค๊ฐ ์ธ๋ก๋ ๋๊ธฐ ์ ๊น์ง ํ์ฑํ๋์ด ์๋ค.
- DiffUtil์ ๊ฐ ๋น๊ตํด์ ๋ฐ์ดํฐ๋ง ์ฒ๋ฆฌํด์ฃผ๋ ์ ํธ ์ฑ ํด๋์ค๋ผ ๊ฐ์ฒด ์ํ๋ฅผ ์ ์งํ๊ณ ์์ ํ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ์ธ์คํด์ค๋ฅผ ๋งค๋ฒ ์๋ก ๋ง๋ค ํ์๊ฐ ์์ด์ ์ ์ญ์ผ๋ก ์ ์ธํ๋ ๊ฒ ์ข ๋ ์ ํฉํ๋ค.
- ๊ฑฐ์ ๋น์ทํ ์ด์ผ๊ธฐ์ด๊ธดํ๋ฐ DiffUtil์ ๊ตณ์ด ์ธ์คํด์ค ํ ํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋งค๋ฒ ์ธ์คํด์ค๋ก ๋ง๋ค์ด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋๊ทธ๋ ์๋นํ๊ธฐ ๋ณด๋ค๋ ํ๋ฒ ์์ฑํด์ ๊ณ์ ์ฐ๋๊ฒ ๋ฉ๋ชจ๋ฆฌ ์ ์ธ ํจ์จ์ ๋์ผ ์ ์๋ค.
=> DiffUtil์ ๋งค๋ฒ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ์ญ์ผ๋ก ์ ์ธํ๋ ๊ฒ ์ข๊ณ , class์ ์ข ์์์ผ์ ์กฐ๊ธ์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํ๊ธฐ ์ํด companion object์ ์ ์ธํ๋ ๊ฒ ๊ถ์ฅ๋๋ค...๊ณ ์ดํดํ๋ค.
# DiffUtil์ ์ฐ๊ฒฐ๋ ๋ฆฌ์คํธ๊ฐ ์ ์ญ ๋ณ์์ด๊ณ , ๊ทธ ๋ ์์ ํ๋ค๋ฉด ๊ฐ์ด ๋ณ๊ฒฝ ๋๋์ง?
ListAdapter์ ์ฐ๊ฒฐ๋ list๋ฅผ ๊ทธ๋๋ก submitList()์ ๋ฃ์ผ๋ฉด ์ํํ๋ค. ์ด๋ฏธ ์ฐธ์กฐ์ค์ธ ์ธ์คํด์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒฝ์ฐ์ DiffUtil์ ๋๋ ค์ oldItem - newItem ๋น๊ตํด์ ์ฐธ์กฐํ๋๋ฐ, ๋ง์ฝ ์ฐธ์กฐ์ค์ธ ์ธ์คํด์ค๊ฐ ๋ณ๊ฒฝ๋์ง์์์ผ๋ฉด DiffUtil์ ๋์ผํ ์ธ์คํด์ค๋ก ๊ฐ์งํด์ update๋ฅผ ์ํํ์ง์๋๋ค.
๊ทธ๋์ list๊ฐ ์ ๋ฐ์ดํธ ๋๊ณ ๋์, ํน์๋ชจ๋ฅผ ๊ฒ์ฌ์ค๋ฅ๋ฅผ ๋ง๊ธฐ์ํด toMutableList()๊ฐ์ ๊ฑธ๋ก ์ ์ธ์คํด์ค๋ฅผ ํ ๋นํด sumbitList()ํด์ค์ผํ๋ค.
rvAdapter.submitList(list.toMutableList())
์ด๋ list๋ ์ ์ญ์ผ๋ก ์์ฑ๋์ด, ๋งค๋ฒ ์ธ์คํด์ค๋ฅผ ์๋ก ๋ง๋ค์ง์๋๋ค๋ ์ ์ ์กฐ๊ฑด์ด ์๋ค.
toMutableList๋ก ๋๊ฒจ์ฃผ๋ฉด diffUtil์ด ๋ค๋ฅธ ์ธ์คํด์ค๋ก ์ธ์ํด์ ์์ ๊ฐ์๋ผ์ ์ ์์ ์ผ๋ก ๋ฆฌ์คํธ ์ ๋ฐ์ดํธ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'Android ๐ฅ๏ธ > ์ฝ์งโ๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ง๋ ฌํ - Parcelize, Parcelable, Serializable (0) | 2024.04.05 |
---|---|
์๋๋ก์ด๋ ๋ฌดํ์คํฌ๋กค ๊ธฐ์ด - Infinite Scroll, Endless Scroll (0) | 2024.04.03 |
[๋ฒ๊ทธ/์ค๋ฅ] Uri(Url) encoding/decoding - API ์ฌ์ฉ์ (0) | 2024.03.29 |
๋ฉํฐ๋ชจ๋ ๋์ ๊ธฐ(3) - Kotlin DSL, buildSrc (0) | 2023.12.15 |
๋ฉํฐ๋ชจ๋ ๋์ ๊ธฐ(2) - Hilt (0) | 2023.12.15 |