๐ก ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํ RecyclerView์ ๋ํ์ฌ ๊ธฐ๋กํ์์ต๋๋ค !
RecyclerView
- Android์์ ํฐ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ํ๊ธฐ ์ํด ๋์ ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ UI ์ปดํฌ๋ํธ์ ๋๋ค.
- ListView์ ํ์์ผ๋ก ๊ฐ๋ฐ๋์์ผ๋ฉฐ, View๋ฅผ ์ฌํ์ฉํ์ฌ ์ฌ์ฉํ๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
RecyclerView | Android Developers
ListView์ ์ฐจ์ด์
ViewHolder ํจํด ๋ด์ฅ
- ListView์์๋ ViewHolder ํจํด์ด ํ์๊ฐ ์๋๋ฉฐ, ์ฌ์ฉ์๊ฐ ์ง์ ๊ตฌํํด์ผ ํ์ต๋๋ค.
- ํ์ง๋ง RecyclerView์์๋ ์ด ํจํด์ด ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณต๋๋ฉฐ ์ฝ๋์ ์ค๋ณต์ ์ค์ด๊ณ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ ์ฐํ LayoutManager
- ListView๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ก ๋ฆฌ์คํธ๋ฅผ ์ง์ํ์ง๋ง, RecyclerView๋ LayoutManager๋ฅผ ํตํด ๋ค์ํ ๋ ์ด์์์ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
Item Animation & Decorator
- ๊ธฐ๋ณธ์ ์ผ๋ก ์์ดํ ์ถ๊ฐ, ์ญ์ , ์ด๋ ์ ์ ๋๋ฉ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ItemDecoration ํด๋์ค๋ฅผ ํตํด ๊ตฌ๋ถ์ , ์ฌ๋ฐฑ ๋ฑ ๋ค์ํ ์์ดํ ๊ฐ์ ๋ฐ์ฝ๋ ์ด์ ์ ์ ์ฐํ๊ฒ ์ค์ ํ ์ ์์ต๋๋ค.
์ฑ๋ฅ ํฅ์
- ๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ๋ ๋์ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฒ๋ฆฌ
- ListView์์๋ notifyDataSetChanged()๋ฅผ ํตํด์ ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ค์ ๋ก๋ํด์ผ ํ์ง๋ง, RecyclerView์์๋ ๋ค์ํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
๊ตฌํ
ViewHolder
- Adapter๊ฐ RecyclerView์ ๊ฐ๋ณ ํญ๋ชฉ์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ๋๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
- findViewById ํธ์ถ์ ์ต์ํํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val textView: TextView = itemView.findViewById(R.id.textView)
}
Adapter
- Adapter๋ ๋ฐ์ดํฐ์ RecyclerView๋ฅผ ์ฐ๊ฒฐํ๊ณ , ๊ฐ ํญ๋ชฉ์ ๋ ์ด์์ ์์ฑ๊ณผ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๋ด๋นํฉ๋๋ค.
class MyAdapter(private val items: List<Item>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
// onCreateViewHolder - ๊ฐ ํญ๋ชฉ์ ๋ ์ด์์์ ์ด๊ธฐํ
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_layout, parent, false)
return MyViewHolder(view)
}
// onBindViewHolder - ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
holder.textView.text = items[position].text
}
// getItemCount - ํญ๋ชฉ ์ ๋ฐํ
override fun getItemCount(): Int {
return items.size
}
}
- ๋ฐ์ดํฐ ํด๋์ค๋ฅผ ์ ์ํ๊ณ ๋ฆฌ์คํธ๋ฅผ ์ด๋ํฐ์ ์ฐ๊ฒฐํ์ฌ ๋ฆฌ์ฌ์ดํด๋ฌ ๋ทฐ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
// LayoutManager ์ค์ (์ธ๋ก ๋ฆฌ์คํธ)
recyclerView.layoutManager = LinearLayoutManager(this)
// Adapter ์ค์
val items = listOf(Item("Item 1"), Item("Item 2"), Item("Item 3"))
recyclerView.adapter = MyAdapter(items)
- ์ฃผ์ํ ์ ์ xml์ด๋ Programmatically ์ฝ๋ ์์์ layoutManager๋ฅผ ๋ฐ๋์ ์ ์ธํด์ผ ํฉ๋๋ค.
LayoutManager
- RecyclerView์ ํญ๋ชฉ ๋ฐฐ์น๋ฅผ ๊ฐ์ง๋ฉฐ, ์ปค์คํ ๋ ์ด์์ ๋งค๋์ ๋ ๊ตฌํ ๊ฐ๋ฅํฉ๋๋ค.
DataChange
- RecyclerView์์๋ Adapter์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ณํ๋ฅผ ์๋ฆฌ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ด๋ฅผ ํตํด์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ก๋ํ์ง ์๊ณ ๋ ํน์ ํญ๋ชฉ์ด๋ ๋ฒ์์ ๋ฐ์ดํฐ๋ง ์ ๋ฐ์ดํธ, ์ถ๊ฐ, ์ญ์ , ์ด๋ ๋ฑ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- ํ์ํ ๋ถ๋ถ๋ง ๋ค์ ๋ ๋๋งํ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ์ฑ๋ฅ ๋ญ๋น๋ฅผ ์ค์ผ ์ ์๊ณ , ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฑ์ ์ฑ๋ฅ์ ํฌ๊ฒ ๊ฐ์ ํ ์ ์์ต๋๋ค.
notifyDataSetChanged()
- ๋ฐ์ดํฐ ์ ์ฒด๊ฐ ๋ณ๊ฒฝ ๋จ์ ์๋ฆฝ๋๋ค.
- ์ ์ฒด๋ฅผ ๋ค์ ๋ก๋ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ฉฐ, ์ฃผ๋ก ํฐ ๋ณํ๊ฐ ์์ ๋ ํ์ฉํฉ๋๋ค.
notifyItemChanged(int position)
- ํน์ ์์น์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์์ ์๋ฆฝ๋๋ค.
- ํด๋น ์์น์ ์์ดํ ๋ง ๋ค์ ๊ทธ๋ ค์ง๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ ๋๋ค.
- ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋ ์ ๊ฐ์ ๋ฉ์๋๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- notifyItemInserted(int position)
- notifyItemRemoved(int position)
notifyItemRangeChange(int positionStart, int itemCount)
- ํน์ ๋ฒ์์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์์ ์๋ฆฝ๋๋ค.
- notifyItemRangeChange(3,5)๋ผ๋ฉด 3๋ฒ์งธ ์์ดํ ๋ถํฐ 5๊ฐ์ ๋ณํ๋ฅผ ์๋ฆฝ๋๋ค.
- ๊ฐ์ ๋ฐฉ์์ผ๋ก ์๋์ ๊ฐ์ ๋ฉ์๋๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- notifyItemRangeInserted(int positionStart, int itemCount)
- notifyItemRangeRemoved(int positionStart, int itemCount)