๐ก ์๋๋ก์ด๋์์ List๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ ListView์ ๋ํ์ฌ ํ์ตํ์์ต๋๋ค !
ListView
- ๋ฆฌ์คํธ๋ทฐ๋ ๋ฐ์ดํฐ ๋ชฉ๋ก์ ๋์ดํ์ฌ ํ๋ฉด์ ํ์ํ๋ ๋ทฐ ๊ทธ๋ฃน์ ํ ์ข ๋ฅ์ ๋๋ค.
- ์ฌ๋ฌ ๊ฐ์ ์์ดํ ์ค์ ํ๋๋ฅผ ์ ํํ ์ ์๋ Selection Widget ์ ๋๋ค.
- ListView๋ฅผ ํจ์จ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํด์๋ convertView์ ViewHolder ํจํด์ ํจ์จ์ ์ผ๋ก ํ์ฉํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- ์ด ํจํด์ ํตํด์ ๋ฆฌ์คํธ ์์ดํ ์ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
converView
- ListView์์ ๊ธฐ์กด์ ๋ทฐ๋ฅผ ์ฌ์ฌ์ฉํ ๋ ์ฌ์ฉ๋๋ ํ๋ผ๋ฏธํฐ์ ๋๋ค.
- adapter์์ ์ด์ ๋ทฐ๊ฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ทธ ๋ทฐ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ๋ฆฌ์คํธ๊ฐ ์คํฌ๋กค ๋ ๋ ์๋ก์ด ์์ดํ ์ ํ์ํ ๋๋ง๋ค ์๋ก์ด ๋ทฐ๋ฅผ ์์ฑํ์ง ์๊ณ , ์ด๋ฏธ ์ฌ์ฉ๋ ๋ทฐ๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ์ต์ ํํฉ๋๋ค.
ViewHolder
- Inflate๋ฅผ ์ต์ํํ๊ธฐ ์ํด์ view๋ค์ ๊ฐ ์์์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๊ฒ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ๊ธฐ ์ํ ๊ฐ์ฒด์ ๋๋ค.
- ๋ทฐ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅํ์ฌ ๋งค๋ฒ findViewById()๋ฅผ ํธ์ถํ์ง ์๋๋ก ํฉ๋๋ค.
- convertView๊ฐ ์ฌ์ฌ์ฉ๋ ๋ ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
- RecyclerView์ ๋ค๋ฅด๊ฒ ListView๋ Viewholder ํจํด์ด ์ ํ ์ฌํญ์ ๋๋ค.
inflate()
- ๋ถํ๊ฒ ํ๋ค๋ ๋ป์ผ๋ก, ์๋๋ก์ด๋์์๋ xml์ ํ์๋ ๋ ์ด์์๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ฒดํ ์ํค๋ ํ๋์ ๋งํฉ๋๋ค.
- xml์ ์ฝ๋๋ฅผ ๊ฐ์ฒดํํ์ฌ ์ฝ๋์์ UI ์์ ๋ฑ์ ์ฌ์ฉํ๊ธฐ ์ํด inflateํ๋ฉฐ, setContentView() ํจ์์์ ํด๋น ๋์์ด ์ด๋ฃจ์ด์ง๋๋ค.
Adapter
- ListView์ ์ฌ์ฉ์๊ฐ ์ ์ํ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ํด์๋ Adapter๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
- ์ด๋ํฐ๋ ์ฌ์ฉ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋ทฐ๋ฅผ ์์ฑํด์ฃผ๋ ๊ฐ์ฒด๋ก ListView์๋ ๋ ๋ฆฝ์ ์ผ๋ก ๋์ํ๋ ๊ฐ์ฒด์ ๋๋ค.
- ListView๋ Adapter๋ก๋ถํฐ ์์ฑ๋ ๋ทฐ๋ฅผ ๋ฐ์ ListView์ ํ ํญ๋ชฉ์ผ๋ก ๋ฐฐ์นํฉ๋๋ค.
- Adapter๋ฅผ ์์ฑํ๊ณ , ViewHolder ํจํด์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
private class MyListAdapter(context: Context, private val data: List<String>) : BaseAdapter() {
private val inflater: LayoutInflater = LayoutInflater.from(context)
override fun getCount(): Int = data.size
override fun getItem(position: Int): String = data[position]
override fun getItemId(position: Int): Long = position.toLong()
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val view: View
val holder: ViewHolder
if (convertView == null) {
// convertView๊ฐ null์ธ ๊ฒฝ์ฐ ์๋ก์ด ๋ทฐ๋ฅผ ์์ฑํ๊ณ ViewHolder๋ฅผ ์ค์
view = inflater.inflate(R.layout.list_item, parent, false)
holder = ViewHolder()
holder.textView = view.findViewById(R.id.itemTextView)
view.tag = holder
} else {
// convertView๊ฐ ์ฌ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ViewHolder๋ฅผ ๊ฐ์ ธ์ด
view = convertView
holder = view.tag as ViewHolder
}
// ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
holder.textView?.text = getItem(position)
return view
}
// ViewHolder ํจํด์ ์ํ ๋ด๋ถ ํด๋์ค
private class ViewHolder {
var textView: TextView? = null
}
}
converView ์ฌ์ฌ์ฉ
- convertView๊ฐ null ์ผ ๋๋ง ์๋ก์ด ๋ทฐ๋ฅผ ์์ฑํ๊ณ , ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ convertView๋ฅผ ์ฌ์ฌ์ฉํฉ๋๋ค.
- ์ด๋ก ์ธํด ๋ฆฌ์คํธ๊ฐ ์คํฌ๋กค ๋ ๋ ์๋ก์ด ๋ทฐ๋ฅผ ์์ฑํ์ง ์์ผ๋ฏ๋ก ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
ViewHolder ํจํด
- ViewHolder ํด๋์ค๋ ๋ฆฌ์คํธ ์์ดํ ์ ๋ทฐ ์ฐธ์กฐ๋ฅผ ์ ์ฅํฉ๋๋ค.
- ๋ทฐ๋ฅผ ์ฒ์ ์์ฑํ ๋ ViewHolder๋ฅผ ์์ฑํ๊ณ , ์ด ๊ฐ์ฒด๋ฅผ converView์ ํ๊ทธ๋ก ์ ์ฅํฉ๋๋ค.
- ์ด ํ์ converView๊ฐ ์ฌ์ฌ์ฉ๋ ๋, ViewHolder ๊ฐ์ฒด๋ฅผ ์ฌ์ฌ์ฉํ์ฌ findViewById() ํธ์ถ์ ํผํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
- getItem(positon)์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ViewHolder์ textView์ ์ค์ ํจ์ผ๋ก์จ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ์ํํฉ๋๋ค.
ListView์ ํ๊ณ
- ๋ฆฌ์คํธ ๋ทฐ๋ ์๋์ ๊ฐ์ ํ๊ณ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
- ์ ํ๋ ์ ๋๋ฉ์ด์ ์ ๊ณต
- ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ ๋ณต์กํ ๋ ์ด์์์์ ์ฑ๋ฅ ์ ํ
- ์ ํ๋ ๋ทฐ ํ์ ๊ณผ ์ด๋ํฐ์ ๋ณต์ก์ฑ ์ฆ๊ฐ
- ๋ถ๋ถ ๊ฐฑ์ ์ ์ด๋ ค์์ผ๋ก ๊ฐ๋จํ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์๋ฆผ๋ง ๊ฐ๋ฅ (notifyDataSetChanged())
- ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด์ RecyclerView๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
์ ๋ฆฌ
- ListView์ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ๊ณผ converView, ViewHolder ํจํด์ ๋ํ์ฌ ํ์ตํ์์ต๋๋ค.
- ์ด ํจํด์ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
- RecyclerView๋ฅผ ํ์ฉํ๋ค๋ฉด ListView์ ํ๊ณ๋ฅผ ๋ณด์ํ๊ณ ๋ ๋์ ์ ์ฐ์ฑ๊ณผ ์ฑ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ๊ฐ๋จํ ๋ชฉ๋ก์ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ณ ์ ํ ๋๋ ListView๊ฐ ์ ์ฉํ ์ ์์ง๋ง, ์ ์ง๋ณด์์ ํ์ฅ์ฑ์ ๊ณ ๋ คํ๋ค๋ฉด RecyclerView๋ฅผ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.