๐ŸŽ’ ๊ณต๋ถ€

RecyclerView์— ๋Œ€ํ•˜์—ฌ (feat. ListView)

dev_sia 2023. 11. 3. 19:03

์•ˆ๋…•ํ•˜์„ธ์š”.

RecyclerView์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ •๋ฆฌํ•˜๋‹ค ๋ณด๋‹ˆ ๊ธ€์ด ๊ธธ์–ด์งˆ ๊ฒƒ ๊ฐ™์•„ ์‹œ๋ฆฌ์ฆˆ๋กœ ๋‚˜๋ˆ ์„œ ๊ธ€์„ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•ด์š”.

ํ˜„์žฌ ๊ณ„ํš์œผ๋กœ๋Š” ์•ฝ 4ํŽธ์˜ ์‹œ๋ฆฌ์ฆˆ๋กœ ์ž‘์„ฑํ•˜๋ ค๊ณ  ํ•˜์ง€๋งŒ ์ค‘๊ฐ„์— ์ƒ๋žต๋˜๊ฑฐ๋‚˜ ๋Š˜์–ด๋‚  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. RecyclerView์— ๋Œ€ํ•˜์—ฌ (feat. ListView)
  2. RecyclerView ๊ตฌ์„ฑ์š”์†Œ
  3. RecyclerView Deep Dive (feat. RecyclerView.java)
  4. RecyclerView CustomView

์ผ์ฃผ์ผ์— ํ•˜๋‚˜์”ฉ์€ ์“ฐ๊ฒ ์ง€...๋ผ๋Š” ๋งˆ์Œ๊ฐ€์ง์œผ๋กœ ์‹œ์ž‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

RecyclerView

 

RecyclerView  |  Android Developers

androidx.appsearch.builtintypes.properties

developer.android.com

์— ๋”ฐ๋ฅด๋ฉด, RecyclerView์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

A flexible view for providing a limited window into a large data set.
๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์…‹์— ์ œํ•œ๋œ ์ฐฝ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ์œ ์—ฐํ•œ ๋ทฐ

 

์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋Š” ์œ„์ ฏ์ž…๋‹ˆ๋‹ค.

Android Jetpack์˜ ๊ตฌ์„ฑ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ•˜๋ฉฐ, RecyclerView๋ผ๋Š” ํด๋ž˜์Šค๋„ ์กด์žฌํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋™๋ช…์ด์ธ๊ฐ™์€ ๋А๋‚Œ์ด๋„ค์š”.

Android Jetpack recyclerview

์ฐธ๊ณ ๋กœ ์•ˆ๋“œ๋กœ์ด๋“œ ๊ฐœ๋ฐœ์ž ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ๋Š” ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋•Œ RecyclerView๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ ๊ทน ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํŠน์ง•

๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋ทฐ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ , ์žฌํ™œ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜๋งŒํผ์˜ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ๋งŒํผ๋งŒ ์ƒ์„ฑํ•ด์„œ ์žฌํ™œ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ทฐ๋ฅผ ์žฌํ™œ์šฉํ•˜๋ฉด ์–ด๋–ค ์žฅ์ ์ด ์žˆ์„๊นŒ์š”?

  1. ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”
  2. ์†๋„ ํ–ฅ์ƒ
  3. ๋ถ€๋“œ๋Ÿฌ์šด ์Šคํฌ๋กค

์žˆ๋Š” ๋ทฐ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ ˆ์ด์•„์›ƒ์„ ๋ฐ์ดํ„ฐ ๊ฐฏ์ˆ˜๋งŒํผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ฐ์†Œํ•˜๊ณ , ๋ฉ๋‹ฌ์•„ ์†๋„๋„ ์˜ฌ๋ผ๊ฐ€๊ณ , ์Šคํฌ๋กค ๋ชจ์…˜๋„ ๋ถ€๋“œ๋Ÿฌ์›Œ์ง€๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋ทฐ ์ƒ์„ฑ์— ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฝ”์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๊ธธ๋ž˜?

๊ทธ๋Ÿผ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฝ”์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๊ธธ๋ž˜ ListView๋ฅผ ์“ฐ์ง€ ๋ง๋ผ๊ณ  ์‹ ์‹ ๋‹น๋ถ€ํ•˜๋Š” ๊ฑธ๊นŒ์š”?

๋‹น์—ฐํžˆ ์žˆ๋Š” ๋ทฐ๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๋ฐ์— ์ฝ”์ŠคํŠธ๊ฐ€ ๋งŽ์ด ๋“ค์–ด๊ฐˆ ๊ฒƒ ๊ฐ™์€ ๋А๋‚Œ์ด ๋“ค๊ธด ํ•ฉ๋‹ˆ๋‹ค.

๋ทฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๋ฐ์—๋„ ๋งŽ์€ ์ฝ”์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ, ๊ฒฐ์ •์ ์œผ๋กœ๋Š” Layout Inflate ๊ณผ์ •์—์„œ์˜ ์ฝ”์ŠคํŠธ๊ฐ€ ๋ฌด์‹œ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.

์•„๋ž˜์œ„๋กœ ์Šคํฌ๋กคํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ๋ณด์—ฌ์ค„ ๋ทฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ๋ทฐ๋ฅผ inflateํ•˜๋Š” ๋ฐ์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‹คํ–‰ ์‹œ๊ฐ„๋„ ๋ฌธ์ œ์ธ๋ฐ, ์‹ฌ์ง€์–ด layout inflate๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋„ ์•ˆ ๋ฉ๋‹ˆ๋‹ค. UI ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ListView๋กœ ๋ฐ์ดํ„ฐ ๋ชฉ๋ก์„ ๋งŒ๋“ค๊ณ  ์‹คํ–‰ํ•ด์„œ ์ซ™์ซ™ ์Šคํฌ๋กคํ•ด ๋ณด๋ฉด ๋ฒ„๋ฒ…...๋ฒ„๋ฒ„๋ฒ…...ํ•˜๋Š” ๋А๋‚Œ์ด ๋“ญ๋‹ˆ๋‹ค.

์“ฐ์ง€ ๋ง๋ผ๋Š” ๋ฐ๋Š” ์ด์œ ๊ฐ€ ์žˆ๋Š” ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

ListView๋Š” ์žฌํ™œ์šฉ์ด ์•ˆ๋˜๋‚˜์š”

RecyclerView๋ฅผ ๊ณต๋ถ€ํ•ด ๋ณธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ListView์™€ ๋น„๊ตํ•ด์„œ RecyclerView๊ฐ€ ์„ฑ๋Šฅ์ด ๋” ์ข‹์œผ๋‹ˆ RecyclerView๋ฅผ ์จ์•ผ ํ•œ๋‹ค...๋Š” ์š”์ง€์˜ ๊ธ€์„ ๋งŽ์ด ๋ดค์„ ๊ฒƒ ๊ฐ™์€๋ฐ์š”.

๊ทธ๋Ÿผ ListView์˜ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ์€ ์–ด๋–จ๊นŒ์š”? ์ •๋ง ๊ทธ๋ ‡๊ฒŒ ์ ˆ๋ง์ ์ผ๊นŒ์š”?

์‚ฌ์‹ค ListView์—๋„ ViewHolder ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ RecyclerView์™€ ๋น„์Šทํ•˜๊ฒŒ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ListView๋Š” ViewHolder ํŒจํ„ด์„ "๊ฐ•์š”"ํ•˜์ง€ ์•Š๊ณ , ํšก์Šคํฌ๋กค๋„ ์•ˆ๋˜๊ณ , ์• ๋‹ˆ๋ฉ”์ด์…˜๋„ ์•ˆ๋˜๊ณ , ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค notifyDataSetChanged()๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ๋ทฐ๋ฅผ ๊ฐฑ์‹ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๋‹นํžˆ ๋ฒˆ๊ฑฐ๋กญ์ฃ ?

์ง„์งœ ์“ฐ์ง€ ๋ง๋ผ๋Š” ๋ฐ๋Š” ์ด์œ ๊ฐ€ ์žˆ๋Š” ๋ฒ•์ž…๋‹ˆ๋‹ค...

 

 

๋งˆ๋ฌด๋ฆฌ

๋‹ค์Œ ๊ธ€์—์„œ๋Š” RecyclerView์˜ ๊ตฌ์„ฑ์š”์†Œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.