[Android TIL] 240416 (์Šคํƒ ๋‹ค๋“œ๋ฐ˜ 4์ฃผ์ฐจ ๊ณผ์ œ ์™„๋ฃŒ : RecyclerView MultiView Type ๊ตฌํ˜„)
๋ฐ˜์‘ํ˜•

 

 

 

 

 

 

 

๐ŸŒฑ Today I Learned (์ง‘์ค‘์‹œ๊ฐ„ : 7์‹œ๊ฐ„ 0๋ถ„)

  1. (09:50 ~ 11:10 / 1์‹œ๊ฐ„ 20๋ถ„) ๋ฐ์ผ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด ๋ฐ ํŒ€ ์Šคํฌ๋Ÿผ
  2. (11:10 ~ 11:30 / 20๋ถ„) ํŠœํ„ฐ๋‹˜ ๊ณผ์ œ ์•ˆ๋‚ด
  3. (11:30 ~ 13:00 / 1์‹œ๊ฐ„ 30๋ถ„) ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ 4์ฃผ์ฐจ ๊ณผ์ œ ๊ตฌํ˜„
  4. (14:10 ~ 15:10) ๊ฐœ์ธ์ ์ธ ๊ณต๋ถ€ : ํˆฌ์ž, ๋งˆ์ผ€ํŒ…
  5. (16:00 ~ 18:50 / 2์‹œ๊ฐ„ 50๋ถ„) ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ 4์ฃผ์ฐจ ๊ณผ์ œ ๊ตฌํ˜„ 1์ฐจ ์™„๋ฃŒ
  6. (19:20 ~ 19:40 / 20๋ถ„) ๊ณผ์ œ ๊นƒํ—ˆ๋ธŒ ์—…๋กœ๋“œ ๋ฐ README.md ์ˆ˜์ •
  7. (19:40 ~ 20:40 / 1์‹œ๊ฐ„) ํŒ€์› ์ฝ”๋“œ ๋ถ„์„

*** ์ ์‹ฌ 13:00 ~ 14:00 / ์ €๋… 18:00 ~ 19:00 ์ œ์™ธ

โ€‹

๐Ÿ“… ์ด๋ฒˆ ์ฃผ ๋ชฉํ‘œ

  • [V] ์ˆ™๋ จ ๊ฐ•์˜ ๋‹ค ๋“ฃ๊ธฐ
  • [  ] ์Šคํƒ ๋‹ค๋“œ 2์ฃผ์ฐจ ์‹ฌํ™” ๊ตฌํ˜„ : ์ˆ™๋ จ ๊ฐ•์˜ ์ฒดํ™”(fragment, fragment ๊ฐ„์˜ ๋ฐ์ดํ„ฐ์ „๋‹ฌ) ํฌ๊ธฐ
  • [V] ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ ๋ฐ€๋ฆฐ ๊ฐ•์˜ ๋“ฃ๊ธฐ
  • [V] ์ž…๋ฌธ ๊ฐœ์ธ ๊ณผ์ œ ํ•ด์„ค ํ•™์Šต
  • [V] ๋ฒ ์ด์ง๋ฐ˜ ๊ฐ•์˜ 4์ฃผ์ฐจ๊นŒ์ง€
  • [V] ์Šคํƒ ๋‹ค๋“œ 4์ฃผ์ฐจ ๊ณผ์ œ ๊ตฌํ˜„ 
  • [  ] ์ˆ™๋ จ ๊ฐœ์ธ ๊ณผ์ œ ํ•„์ˆ˜ ๊ตฌํ˜„ : ์ˆ™๋ จ ๊ฐ•์˜ ์ฒดํ™”(notification, dialog, recyclerview, fragment ์ข…ํ•ฉ)
  • [  ] ์ •์ฐฝ๊ฒฝ ๋‚ด์šฉ ์ •๋ฆฌ
  • [  ] ๋ฐ€๋ฆฌ์˜ ์„œ์žฌ ์•ˆ๋“œ๋กœ์ด๋“œ ์„œ์  ์ง„๋„ ๋ถ€๋ถ„๊นŒ์ง€ ๋‹ค ํ›‘๊ธฐ
  • [  ] ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ง‘์ค‘ ์ฝ”๋“œ์นดํƒ€
  • [  ] ๋งํฌ ์ˆ˜๊ฐ•
  • [  ] (์‹ฌํ™”) KIA ๊ฐœ๋… ํ›‘๊ธฐ
  • [  ] (์‹ฌํ™”) Android Developer ์ฝ๊ธฐ
  • [  ] (์‹ฌํ™”) ๊ฐœ์ธํ”„๋กœ์ ํŠธ UI ๊ตฌํ˜„
  • [  ] (์‹ฌํ™”) ์ €๋ฒˆ ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋œฏ์–ด๋ณด๊ธฐ

โ€‹

 

 

 

 

1. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด (์‚ผ์ด์‚ฌ)

 

[Kotlin] ์‚ผ์ด์‚ฌ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๋ฌธ์ œ https://school.programmers.co.kr/learn/courses/30/lessons/131705 ์ ‘๊ทผ ์ฃผ์–ด์ง„ number ๋ฐฐ์—ด์˜ ์›์†Œ ์ค‘ ํ•ฉ์ณค์„ ๋•Œ 0์ด ๋˜๋Š” ์„ธ ์Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฌธ์ œ๋‹ค. ๋ฐ˜๋ณต๋ฌธ์„ ์—ฌ๋Ÿฌ ๊ฐœ ์จ์„œ ์•ž์˜ ์ˆ˜๋ฅผ ๋”ํ•˜๋Š” ๋ฐฐ์—ด์— ๋„ฃ

limheejin.tistory.com

  • ์ฒ˜์Œ์— ์ค‘๋ณต๋œ ์›์†Œ๋กœ ๊ตฌ์„ฑ๋œ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ์ค„ ์•Œ๊ณ  ์‚ฝ์งˆ์„ ์ข€ ํ–ˆ๋‹ค.
  • ๋ฌธ์ œ๋ฅผ ํ’€๊ณ ๋„ ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ๊ถ๊ธˆ์ฆ๋“ค์ด ์žˆ์—ˆ๋‹ค. 
    (1) ๋งŒ์•ฝ ์ค‘๋ณต๋œ ์›์†Œ๋กœ ์Œ์„ ๋งŒ๋“ค ์ˆ˜ ์—†์„ ๋• ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฐ€?
    (2) ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ๋ ค์ง„ ํด๋ฆฐ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ depth๋Š” ์ตœ๋Œ€ 2์ด๋‹ค. ์ด ๋ฌธ์ œ์—์„œ๋Š” depth๋ฅผ ์–ด๋–ป๊ฒŒ ์ค„์—ฌ์•ผ ํ• ๊นŒ?
  • (1)๋ฒˆ์˜ ๊ฒฝ์šฐ HashSet์ด๋‚˜ HashMap์œผ๋กœ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, (2)๋ฒˆ์˜ ๊ฒฝ์šฐ depth๋ฅผ ์ค„์ผ ์ˆ˜ ์—†๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.

 

 

 

 

2. ์Šคํƒ ๋‹ค๋“œ๋ฐ˜ 4์ฃผ์ฐจ ๊ณผ์ œ ๊ตฌํ˜„

  • ์บ ํ”„๊ฐ€ ์‹œ์ž‘๋œ ์ด๋ž˜๋กœ ์ œ์ผ ์‚ฝ์งˆ๊ณผ ์‚ฝ์งˆ์„ ๋ฐ˜๋ณตํ•˜๋Š” ์ค‘

 

  • ๋ทฐํ™€๋”๋ฅผ ์œ„ํ•œ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ์–ด๋Œ‘ํ„ฐ๋ฅผ ์•กํ‹ฐ๋น„ํ‹ฐ์— ์—ฐ๊ฒฐํ•ด์„œ ๊ฐ’์„ ๋ฟŒ๋ ค์ฃผ๋Š” ๊ฒŒ ๋„๋ฌด์ง€... ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ”๋‹ค.
    ๊ทธ๋ž˜์„œ ์ธํ„ฐ๋„ท ์„œํ•‘๊ณผ ์œ ํŠœ๋ธŒ๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ์ฐพ์•„๋ณด์•˜๋‹ค. ๊ทธ ์ค‘์—์„œ ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์—ˆ๋˜ ์˜์ƒ์ด๋‹ค.
    ๊ฐ•์˜ํ•˜์‹œ๋Š” ๋ถ„๋„ ์ฒ˜์Œ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ๋ฅผ ๋ฐฐ์šธ ๋•Œ๊ฐ€ ์ฒซ ๋‚œ๊ด€์ด์—ˆ๋‹ค๊ณ  ํ•˜์…”์„œ ๊ทธ๋‚˜๋งˆ ์œ„๋กœ๊ฐ€ ๋๋‹ค.
  • ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ๋ฅผ ๋งŒ๋“ค ๋•Œ์˜ ์ปจ๋ฒค์…˜
    - ๋ณดํ†ต ์•„์ดํ…œ์„ ๋‹ด๋Š” xml ํŒŒ์ผ์˜ ์ด๋ฆ„์€ 'item_card' ํ˜•์‹์œผ๋กœ ์•ž์— item์„ ๋ถ™์—ฌ์ค€๋‹ค.

 

 

(1) ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์•˜๋˜ ๋ฌธ์ œ

 

 

  • ์–ด์ฐŒ์ €์ฐŒ ์ธํ„ฐ๋„ท์„œํ•‘๊ณผ ์œ ํŠœ๋ธŒ์™€ ๋‹ค๋ฅธ ๋ถ„์ด ๋งŒ๋“  ์ฝ”๋“œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ,
    AVD๋ฅผ ์‹คํ–‰ํ•˜๋‹ˆ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•  ์˜์—ญ์ด ๋นˆ ํ™”๋ฉด์œผ๋กœ ๋– ์„œ ํŠœํ„ฐ๋‹˜๊ณผ ๊ณ ๋ฏผ์„ ์˜ค๋ž˜๊ฐ„ ํ–ˆ๋‹ค.

  • ์–ด๋Œ‘ํ„ฐ ์˜์—ญ์„ ํŠœํ„ฐ๋‹˜๊ณผ ๊ฐ™์ด ๊ณ ์น˜๋‹ค๊ฐ€, ํ˜น์‹œ๋‚˜ํ•ด์„œ ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ๋ดค๋Š”๋ฐ
    mutableListOf<CardData>()๋กœ ๋นˆ ๋ฆฌ์ŠคํŠธ ๊ฐ’์œผ๋กœ ๋Œ€๊ฐ• ์„ค์ •๋งŒํ•ด์ฃผ๊ณ  ๋๋‚ด๋ฒ„๋ ธ๋˜ ๊ฒƒ์ด๋‹ค...
  • ์‹ฑ๊ธ€ํ†ค์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์ €๊ฒƒ ์‹œ๋„ํ–ˆ๋˜ ๋ฐ์ดํ„ฐํด๋ž˜์Šค ๋ถ€๋ถ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

CardList.kt

 

CardData.kt

  • ์œ„์™€ ๊ฐ™์ด ๊ตฌํ˜„์„ ํ•ด๋†“๊ณ , CardData ๋ฐ์ดํ„ฐ์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋Š” ํ•จ์ˆ˜ CardList()๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค.
  • private val cardList = mutableListOf<CardData>()๋ฅผ private val cardList = CardList()๋กœ ๋ณ€๊ฒฝํ•˜๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.

 

(์ขŒ) ์ •์ƒ์ ์œผ๋กœ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ชจ์Šต (์šฐ) ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฐ๋™๋œ ๋ชจ์Šต

 

 

(2) ๊ฐ์ข… ์ฝ”๋“œ์ƒ์˜ ๋ฌธ์ œ

  • ์ž‘๋™์€ ํ•ด๋„, ์•„์ง ๊น”๋”ํ•œ ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ์†๋ด์•ผ ํ•  ๋ถ€๋ถ„์ด ๋งŽ์ด ๋‚จ์•˜๋‹ค.
    ์ดํ•ด๋ฅผ ์ œ๋Œ€๋กœ ํ•˜์ง€ ๋ชปํ•œ ์ฑ„๋กœ ์ธํ„ฐ๋„ท/์œ ํŠœ๋ธŒ/๋‹ค๋ฅธ ์ฝ”๋“œ๋ฅผ ์ค‘๊ตฌ๋‚œ๋ฐฉ์œผ๋กœ ํ•ฉ์ณ๋†“์€ ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋‹ค๋ฅธ ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ์ฐธ์กฐํ•˜์—ฌ 'MultiModel.kt' ํŒŒ์ผ์— const val TYPE_1 = 0, TYPE_2 =0... ์„ ์„ ์–ธํ•˜๊ณ 
    ์–ด๋Œ‘ํ„ฐ์—์„œ when(viewType) { TYPE_1 -> ... } ๋“ฑ์œผ๋กœ ๋ถ„๊ธฐ์‹œํ‚จ ๊ฒƒ์ด ์žˆ์—ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ ํŠœํ„ฐ๋‹˜๊ป˜์„œ๋Š” ๊ตณ์ด ์ด๋ ‡๊ฒŒ ํ•  ํ•„์š” ์—†์œผ๋ฉฐ, onBindViewHolder๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ›๊ณ  ์žˆ๋Š” position(:Int)๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค๊ณ  ํ•˜์…จ๋‹ค. var currentItem = cardItems[position] ; when(position) { 1 -> ...} ์ด๋Ÿฐ ์‹์œผ๋กœ!
  • ๋˜ํ•œ ์•„๋ž˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด setOnClickListener์˜ ์œ„์น˜์— ๋Œ€ํ•œ ๋ง์”€์ด ์žˆ์—ˆ๋‹ค.

 

์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ณ€๊ฒฝ
๊ธฐ์กด ์™ผ์ชฝ์˜ ์ƒํƒœ
  • ์ผ๋‹จ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ทฐํ™€๋” ๋‚ด์—์„œ clickListener๋ฅผ ๋„ฃ๋Š” ๊ฒŒ ์ข‹์ง€ ์•Š๋‹ค๊ณ  ํ•˜์…จ๊ณ ,
    ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ๊ตฌํ˜„์„ ํ•˜๋ผ๊ณ  ํ•˜์…จ๋‹ค.
  • intent์— ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•ด ์„ ์–ธํ•œ val context๊ฐ€ ๊ต‰์žฅํžˆ ์•ˆํ‹ฐํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค.
    ๋‚˜์ค‘์— ๊ฐœ๋ฐœ์ด ๋” ์ง„ํ–‰๋˜๋ฉด ์ด ๋ถ€๋ถ„๋•Œ๋ฌธ์— ์•กํ‹ฐ๋น„ํ‹ฐ๊ฐ€ ๊ทธ๋ƒฅ ๊บผ์งˆ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ .

 

 

(3) ์—…๋กœ๋“œ ์™„๋ฃŒ 

 

 

  • ๊นƒํ—ˆ๋ธŒ README.md ์ˆ˜์ •์„ ์™„๋ฃŒํ–ˆ๋‹ค.

 

 

 

 

 

 

๐Ÿ’ญ Retrospect

์‚ฌ์‹ค ์ง€๊ธˆ๊นŒ์ง€ ์บ ํ”„๋ฅผ 3๋ถ„์˜ 1 ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์ตœ์†Œํ•œ ํ‰๊ท  ์ •๋„์˜ ์ดํ•ด๋ ฅ์„ ๊ฐ€์ง€๊ณ  ๋”ฐ๋ผ๊ฐ€๊ณ  ์žˆ๋‹ค๊ณ  ์ž๋งŒํ–ˆ๋‹ค. ํŒ€ํ”„๋กœ์ ํŠธ๋„ ์žฌ๋ฏธ์žˆ์—ˆ๊ณ , ์ƒˆ๋กญ๊ฒŒ ๋ฐฐ์šด ๊ฐœ๋…๋“ค์„ ๋‚ด ์ฝ”๋“œ์— ์ ์šฉํ•ด๊ฐ€๋ฉด์„œ ์–ด์ฐŒ๋๋“  '1์‹œ๊ฐ„ ์ด๋‚ด'๋กœ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ๊ณ , ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฃผ์–ด์ง„ ๊ฐ•์˜๋‚˜ ๊ณผ์ œ๋„ ํฌ๊ฒŒ ๋ฌด๋ฆฌ์—†์ด ๋”ฐ๋ผ๊ฐ€๊ณ  ์žˆ์—ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ๊ฐ€ ๋‚˜์—๊ฒ ์ƒ๊ฐ ์ด์ƒ์œผ๋กœ ์–ด๋ ค์› ๋‹ค. ๊ธฐ์ดˆ ๋‹จ๊ณ„์—์„  '1์‹œ๊ฐ„ ์ด๋‚ด'์— ๊ณ ๋ฏผ์„ ๋๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ, ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ ์–ด๋Œ‘ํ„ฐ ๋ถ€๋ถ„์€ ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ€์„œ ์–ด์ œ ๋ฐค๋ถ€ํ„ฐ ์˜ค๋Š˜ ๋ฐค๊นŒ์ง€ ๊ผฌ๋ฐ• ํ•˜๋ฃจ๋ฅผ ๊ณผ์ œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์ผ๋‹ค.
์ฒ˜์Œ์œผ๋กœ ์–ด๋ ค์›€์— ๋ด‰์ฐฉํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ž˜์„œ ์–ด์ œ ์˜ค๋Š˜ ์ขŒ์ ˆ์„ ๋งŽ์ด ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ...

๊ทธ๋‚˜๋งˆ ๋‹คํ–‰์ธ ๊ฑด ํŠœํ„ฐ๋‹˜์ด๋‚˜ ์„œํ•‘ํ•˜๋ฉด์„œ ๋ณด๊ฒŒ๋œ ์œ ํŠœ๋ธŒ์—์„œ ๊ณตํ†ต์ ์œผ๋กœ ์ด ๋ถ€๋ถ„์„ '์ฒ˜์Œ ์•ˆ๋“œ๋กœ์ด๋“œ๋ฅผ ๋ฐฐ์šฐ๋ฉด์„œ ๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„', '๋ณธ์ธ๋„ ์ฒ˜์Œ์œผ๋กœ ๋‚œ๊ด€์— ๋ด‰์ฐฉํ–ˆ๋˜ ๋ถ€๋ถ„' ์ด์—ˆ๋‹ค๋Š” ์˜๊ฒฌ์„ ๊ณต์œ ํ•ด์ฃผ์…”์„œ, ๊ทน๋ณตํ•  ํž˜์„ ์–ป์—ˆ๋‹ค. ๋‚˜๋งŒ ์–ด๋ ค์šด ๊ฒŒ ์•„๋‹ˆ์—ˆ๋‹ค๋ฉด ๋๋‹ค.

โ€‹

 

 

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T