04
03

# 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๋กœ ์„ ์–ธํ•˜๋ฉด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์ƒ๊ด€์—†์ด ํด๋ž˜์Šค๊ฐ€ ์–ธ๋กœ๋“œ ๋˜๊ธฐ ์ „๊นŒ์ง€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋‹ค.

  1. DiffUtil์€ ๊ฐ’ ๋น„๊ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋งŒ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์œ ํ‹ธ ์„ฑ ํด๋ž˜์Šค๋ผ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งค๋ฒˆ ์ƒˆ๋กœ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์–ด์„œ ์ „์—ญ์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒŒ ์ข€ ๋” ์ ํ•ฉํ•˜๋‹ค.
  2. ๊ฑฐ์˜ ๋น„์Šทํ•œ ์ด์•ผ๊ธฐ์ด๊ธดํ•œ๋ฐ DiffUtil์„ ๊ตณ์ด ์ธ์Šคํ„ด์Šค ํ™” ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋กœ ๋งŒ๋“ค์–ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ๋•Œ๊ทธ๋•Œ ์†Œ๋น„ํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ํ•œ๋ฒˆ ์ƒ์„ฑํ•ด์„œ ๊ณ„์† ์“ฐ๋Š”๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์ ์ธ ํšจ์œจ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

=> DiffUtil์€ ๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ „์—ญ์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒŒ ์ข‹๊ณ , class์— ์ข…์†์‹œ์ผœ์„œ ์กฐ๊ธˆ์ด๋ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด companion object์— ์„ ์–ธํ•˜๋Š” ๊ฒŒ ๊ถŒ์žฅ๋œ๋‹ค...๊ณ  ์ดํ•ดํ–ˆ๋‹ค.

# DiffUtil์— ์—ฐ๊ฒฐ๋œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ „์—ญ ๋ณ€์ˆ˜์ด๊ณ , ๊ทธ ๋•Œ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜๋Š”์ง€?

ListAdapter์— ์—ฐ๊ฒฐ๋œ list๋ฅผ ๊ทธ๋Œ€๋กœ submitList()์— ๋„ฃ์œผ๋ฉด ์œ„ํ—˜ํ•˜๋‹ค. ์ด๋ฏธ ์ฐธ์กฐ์ค‘์ธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ์— DiffUtil์„ ๋Œ๋ ค์„œ oldItem - newItem ๋น„๊ตํ•ด์„œ ์ฐธ์กฐํ•˜๋Š”๋ฐ, ๋งŒ์•ฝ ์ฐธ์กฐ์ค‘์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€์•Š์•˜์œผ๋ฉด DiffUtil์€ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋กœ ๊ฐ์ง€ํ•ด์„œ update๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€์•Š๋Š”๋‹ค.

๊ทธ๋ž˜์„œ list๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜๊ณ ๋‚˜์„œ, ํ˜น์‹œ๋ชจ๋ฅผ ๊ฒ€์‚ฌ์˜ค๋ฅ˜๋ฅผ ๋ง‰๊ธฐ์œ„ํ•ด toMutableList()๊ฐ™์€ ๊ฑธ๋กœ ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ•ด sumbitList()ํ•ด์ค˜์•ผํ•œ๋‹ค. 

rvAdapter.submitList(list.toMutableList())

์ด๋•Œ list๋Š” ์ „์—ญ์œผ๋กœ ์ƒ์„ฑ๋˜์–ด, ๋งค๋ฒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค์ง€์•Š๋Š”๋‹ค๋Š” ์ „์ œ์กฐ๊ฑด์ด ์žˆ๋‹ค.

toMutableList๋กœ ๋„˜๊ฒจ์ฃผ๋ฉด diffUtil์ด ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋กœ ์ธ์‹ํ•ด์„œ ์•„์˜ˆ ๊ฐˆ์•„๋ผ์›Œ ์ •์ƒ์ ์œผ๋กœ ๋ฆฌ์ŠคํŠธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋œ๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^

 

๋ฐ˜์‘ํ˜•
COMMENT