[Android] AdapterView ์ •๋ฆฌ

Minjun Kimยท2023๋…„ 8์›” 23์ผ
1

Android

๋ชฉ๋ก ๋ณด๊ธฐ
22/47
post-thumbnail

๐Ÿ“ SeSAC์˜ 'JetPack๊ณผ Kotlin์„ ํ™œ์šฉํ•œ Android App ๊ฐœ๋ฐœ' ๊ฐ•์ขŒ๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.


โ“ AdapterView ๋ž€?

ํ•ญ๋ชฉ์„ ๋‚˜์—ดํ•˜๊ณ  ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ ์œ ์ €์—๊ฒŒ ์„ ํƒ ๋ฐ›๊ณ ์ž ํ•˜๋Š” ๋ทฐ

  • ๋Œ€ํ‘œ์ ์œผ๋กœ ListView, AutoCompleteTextView, Spinner ๋“ฑ

  • Adapter์— ์˜ํ•ด ํ•ญ๋ชฉ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๋ทฐ

โ— ์ฆ‰, AdapterView๋งŒ์œผ๋กœ๋Š” ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ตœ์ƒ์œ„ ๋ทฐ์˜ ์„œ๋ธŒํด๋ž˜์Šค์ด๋‹ค.


โ“ ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ™”๋ฉด์— ํ‘œ์‹œ ๋ ๊นŒ?

Adapter ๋กœ ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

AdaterView ๋Š” ํ•ญ๋ชฉ์„ ์ถœ๋ ฅํ•˜๊ณ  Adapter ๋Š” AdaqterView์˜ ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•œ๋‹ค.

๐Ÿ“Œ ๋•Œ๋ฌธ์— Adapter์—๊ฒŒ ๋‘ ๊ฐ€์ง€ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  1. ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ
  2. ํ•ญ๋ชฉ ํ•˜๋‚˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ XML ํŒŒ์ผ ์ •๋ณด

โ“ ๊ทธ๋Ÿผ Adapter๊ฐ€ ๋ญ๋ƒ?

  • ๋ทฐ๋Š” ์•„๋‹˜, ๋ทฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ž‘์—…์ž ์ •๋„๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.
    ์ฆ‰, KT ํŒŒ์ผ์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.

  • Adapter๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋ช…์ด๋ฉฐ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ๋•Œ๋ฌธ์— ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๋ฅผ '์–ด๋Œ‘ํ„ฐ'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

  • BaseAdapter๋ถ€ํ„ฐ๊ฐ€ ํด๋ž˜์Šค์ด๊ณ  ArrayAdapter, SimpleAdapter, CursorAdapter ์ •๋„๊ฐ€ ํ”Œ๋žซํผ์—์„œ ์ œ๊ณต๋˜๊ณ  ์žˆ๋‹ค.


๐Ÿ“š ArrayAdapter

ํ•ญ๋ชฉ์— ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ๋‚˜์—ดํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ

์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ํ•˜์ž. ํ•ญ๋ชฉ์ด ๋‚˜์—ด๋˜์–ด ์žˆ์œผ๋‹ˆ ListView๋ฅผ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค.

์ผ๋‹จ ๋ฆฌ์ŠคํŠธ๋ทฐ์— ๋“ค์–ด๊ฐˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ด์ฃผ์ž.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="location">
        <item>๊ฐ•์›๋„</item>
        <item>๊ฒฝ๊ธฐ๋„</item>
        <item>๊ฒฝ์ƒ๋‚จ๋„</item>
        <item>๊ฒฝ์ƒ๋ถ๋„</item>
        <item>๊ด‘์ฃผ๊ด‘์—ญ์‹œ</item>
    </string-array>
</resources>
val datas = resources.getStringArray(R.array.location)
  • values ํ•˜์œ„์— arrays.xml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ <string-array> ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ด ์ฃผ์—ˆ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  getStringArray ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด ํƒ€์ž…์œผ๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค์ž.

์ด์ œ ์šฐ๋ฆฌ๋Š” ์–ด๋–ค Adapter๋ฅผ ์‚ฌ์šฉํ•˜๋ƒ๋งŒ ๊ณ ๋ฏผํ•˜๋ฉด ๋œ๋‹ค.

๋ฌธ์ž์—ด์ด ํ•˜๋‚˜์”ฉ ๋‚˜์—ด๋˜๋Š” ํ•ญ๋ชฉ ๊ตฌ์„ฑ์ด๋‹ˆ ArrayAdapter ๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ์ž.

val adapter = ArrayAdapter(
	this,
	android.R.layout.simple_list_item_1,
	datas
)
listView.adapter = adapter
  • ์–ด๋Œ‘ํ„ฐ์—๊ฒŒ ๋ ˆ์ด์•„์›ƒ XML ํŒŒ์ผ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์ด๋ฅผ ๋ฆฌ์ŠคํŠธ๋ทฐ.์–ด๋Œ‘ํ„ฐ์—๊ฒŒ ์ฃผ์ž…ํ•œ๋‹ค.

  • ์ด ๋•Œ, ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์ปค์Šคํ…€ํ•ด๋„ ๋˜์ง€๋งŒ, ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ArrayAdapter๊ธฐ๋Šฅ
simple_list_item_1ํ•ญ๋ชฉ์— ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ํ•˜๋‚˜
simple_list_item_2ํ•ญ๋ชฉ์— ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ 2๊ฐœ ์œ„์•„๋ž˜ ๋‚˜์—ด
simple_list_item_multiple_choice๋ฌธ์ž์—ด๊ณผ ์˜ค๋ฅธ์ชฝ ์ฒดํฌ๋ฐ•์Šค ์ œ๊ณต
simple_list_item_single_choice๋ฌธ์ž์—ด๊ณผ ์˜ค๋ฅธ์ชฝ ๋ผ๋””์˜ค ๋ฒ„ํŠผ ์ œ๊ณต

๐Ÿ“š SimpleAdapter

ํ•ญ๋ชฉ์— ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜์”ฉ ๋‚˜์—ดํ•˜๋Š” ๊ฒฝ์šฐ ์ด์šฉ

  • ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋Œ‘ํ„ฐ

  • ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฅผ ArrayList ํƒ€์ž…์˜ Map ๊ฐ์ฒด ๋กœ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
    โ— ์ฆ‰, ์ „์ฒด๊ฐ€ List ํƒ€์ž…์— ๊ฐ ํ•ญ๋ชฉ์ด Map ํƒ€์ž…์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋น„ํ•ด์•ผ ํ•œ๋‹ค.

val datas: ArrayList<HashMap<String?, String?>> = ArrayList()
val adapter = SimpleAdapter(
	this,
    datas,
    android.R.layout.simple_list_item_2,
    arrayOf("name", "content"),
    inArrayOf(android.R.id.text1, android.R.id.text2)
)
listView.adapter = adapter
  • arrayOf("name", "content") ๋กœ Map ๊ฐ์ฒด์—์„œ ํ‚ค๊ฐ’์œผ๋กœ ๋ฝ‘์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    ํ‚ค๊ฐ’์„ 2๊ฐœ ์ฃผ์—ˆ์œผ๋‹ˆ ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์— 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค. ํ‚ค๊ฐ’์ด 3๊ฐœ๋ฉด 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฝ‘ํžŒ๋‹ค.

  • inArrayOf(android.R.id.text1, android.R.id.text2) ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋ทฐ๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    "name" ์˜ value๋Š” text1 ๋ทฐ์—, "content"์˜ value๋Š” text2 ๋ทฐ์— ์ถœ๋ ฅ๋œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค๊ณ  ํ•˜์ž.

์šฐ์„  ArrayList ํ˜• Map ๊ฐ์ฒด ๋ฅผ ์ค€๋น„ํ•˜์ž.

val datas: ArrayList<HashMap<String, String>> = ArrayList()
var map: HashMap<String, String> = HashMap()
map["name"] = "LG ํŠธ์œˆ์Šค"
map["content"] = "์„œ์šธ, ์ž ์‹ค ์•ผ๊ตฌ์žฅ"
datas.add(map)

map = HashMap()
map["name"] = "๋‘์‚ฐ ๋ฒ ์ด์Šค"
map["content"] = "์„œ์šธ, ์ž ์‹ค ์•ผ๊ตฌ์žฅ"
datas.add(map)

map = HashMap()
map["name"] = "KT ์œ„์ฆˆ"
map["content"] = "์ˆ˜์›, KT ์œ„์ฆˆ ํŒŒํฌ"
datas.add(map)

๊ทธ๋ฆฌ๊ณ  SimpleAdapter ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

val adapter = SimpleAdapter(
	this,
	datas,
	android.R.layout.simple_list_item_2,
	arrayOf("name", "content"),
	intArrayOf(android.R.id.text1, android.R.id.text2)
)
listView.adapter = adapter
  • intArrayOf ์—์„œ text1์€ ์ฒซ ๋ฒˆ์งธ, text2๋Š” ๋‘ ๋ฒˆ์งธ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๐Ÿ“š ListView

ํ•ญ๋ชฉ์„ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€, ์ œ๊ฑฐ

adapter.notifyDataSetChanged()
  • ์œ„ ํ•จ์ˆ˜๋ฅผ ์ฝœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

ํ•ญ๋ชฉ ์„ ํƒ ์ด๋ฒคํŠธ

listView.setOnItemClickListener { adapterView, view, i, l ->
	//.........
}
  • ์ด๋ฒคํŠธ ์†Œ์Šค์™€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฆฌ์Šค๋„ˆ๋กœ ์—ฐ๊ฒฐํ•œ ๊ตฌ์กฐ

  • ์„ธ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ i๊ฐ€ ์œ ์ €๊ฐ€ ์„ ํƒํ•œ ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค.

์•„๋ž˜๋Š” ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ œ๊ฑฐํ•˜๋Š” ์†Œ์Šค ์ฝ”๋“œ ์˜ˆ์ œ์ด๋‹ค.

package com.kotdev99.android.c33

class MainActivity : AppCompatActivity() {
	val todos = mutableListOf<String>()
	lateinit var adapter: ArrayAdapter<String>
	lateinit var listView: ListView
	lateinit var editText: EditText
	lateinit var button: Button

	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)

		listView = findViewById(R.id.main_list)
		editText = findViewById(R.id.edit)
		button = findViewById(R.id.button)

		adapter = ArrayAdapter(
			this,
			android.R.layout.simple_list_item_1,
			todos
		)
		listView.adapter = adapter

		listView.setOnItemClickListener { adapterView, view, i, l ->
			AlertDialog.Builder(this)
				.setTitle("remove todo")
				.setPositiveButton("OK") { dialog, which ->
					todos.removeAt(i)
					adapter.notifyDataSetChanged()
				}
				.setNegativeButton("Cancel", null)
				.create()
				.show()
		}
		button.setOnClickListener {
			todos.add(editText.text.toString())
			editText.text.clear()
			adapter.notifyDataSetChanged()
		}
	}
}


๐Ÿ“š CustomAdapter

  1. ๊ฐœ๋ฐœ์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€๋กœ ํ•ญ๋ชฉ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„ค์ •๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  2. ๊ฐœ๋ฐœ์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€๋กœ ํ•ญ๋ชฉ๋ณ„ View์˜ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

  3. ๊ฐœ๋ฐœ์ž ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋Œ€๋กœ ํ•ญ๋ชฉ๋ณ„ Layout์„ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉ์‹œ์ผœ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

โ“ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ?

BaseAdapter ํ˜น์€ ArrayAdapter, SimpleAdapter ๋ฅผ ์ƒ์†๋ฐ›์•„ ์ž‘์„ฑํ•œ๋‹ค.

class DriveAdapter(val cxt: Context, val resId: Int, val datas: MutableList<DriveVO>) :
	ArrayAdapter<DriveVO>(cxt, resId) {
	//...........    
}

โ— ์žฌ์ •์˜ ํ•ด์•ผํ•˜๋Š” ๊ธฐ์ดˆ ํ•จ์ˆ˜

  1. getCount()
override fun getCount(): Int {
	return datas.size
}
  • ํ•ญ๋ชฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ด ํ•œ๋‹ค.

  • ๋งŒ์•ฝ size๋ฅผ 0์œผ๋กœ ์ฃผ๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•ด๋„ ํ•ญ๋ชฉ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค.

  1. getView
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
	//...........
}
  • ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝœ ๋˜๋Š” ํ•จ์ˆ˜

  • ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ํ•ญ๋ชฉ์— ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ๋‚˜์—ดํ•  ๊ฑด์ง€, ํ•ญ๋ชฉ์˜ ์ด๋ฒคํŠธ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฑด์ง€, ํ•ญ๋ชฉ์˜ ๋ ˆ์ด์•„์›ƒ์„ ์–ด๋–ป๊ฒŒ ์กฐ์ •ํ•  ๊ฑด์ง€ ์ž‘์„ฑํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • ์ฝœ ๋˜๋Š” ํ•ญ๋ชฉ์˜ ์ธ๋ฑ์Šค ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ position์œผ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

  • ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜ convertView๋Š” ์‚ฌ์šฉํ•  ๋ทฐ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.


๐Ÿงฉ ์‹ค์Šต ์˜ˆ์ œ

์œ„์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•ด๋ณด์ž!

์šฐ์„  ํ•ญ๋ชฉ ๋‚˜์—ด๋˜๋Š” ListView ๋ฅผ ์„ ์–ธํ•˜์ž.

  • activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/custom_listView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" />
  • root ๋ฅผ ๋ฆฌ์ŠคํŠธ ๋ทฐ๋กœ ์„ ์–ธํ–ˆ๋‹ค.


res/layout ํ•˜์œ„์— ํ•ญ๋ชฉ์˜ ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•œ XML ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ž.

  • custom_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/custom_item_type_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/custom_item_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="16sp"
        android:layout_toRightOf="@id/custom_item_type_image" />

    <TextView
        android:id="@+id/custom_item_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/custom_item_title"
        android:layout_alignLeft="@id/custom_item_title"
        android:layout_marginLeft="16sp" />

    <ImageView
        android:id="@+id/custom_item_menu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:src="@drawable/ic_menu" />

</RelativeLayout>


๋ฐ์ดํ„ฐ ํด๋ž˜์Šค DriveVO๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • DriveVO.kt
package com.kotdev99.android.c34

data class DriveVO(
	var title: String,
	val date: String,
	val type: String
)

๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ทฐ๋ฅผ Holder์— ์ค€๋น„ํ•˜์ž.

  • DriveHolder.kt
class DriveHolder(root: View) {
	var typeImageView: ImageView
	var titleView: TextView
	var dateView: TextView
	var menuImageView: ImageView

	init {
		typeImageView = root.findViewById(R.id.custom_item_type_image)
		titleView = root.findViewById(R.id.custom_item_title)
		dateView = root.findViewById(R.id.custom_item_date)
		menuImageView = root.findViewById(R.id.custom_item_menu)
	}
}
  • ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ทฐ๋ฅผ ์„ ์–ธํ•˜๊ณ , ๊ทธ ๋ทฐ๋ฅผ ํš๋“ํ•˜๋Š” ์—ญํ• ์ž

  • ์–ด๋Œ‘ํ„ฐ ์ชฝ์—์„œ ๋”ฐ๋กœ ๋ทฐ๋ฅผ ์ค€๋น„ํ•  ํ•„์š” ์—†์ด ํ•ด๋‹น ํ™€๋” ๋‚ด์— ์žˆ๋Š” ๋ทฐ๋ฅผ ์ด์šฉํ•œ๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ 'ํ™€๋” ํด๋ž˜์Šค' ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.


์ด์ œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์–ด๋Œ‘ํ„ฐ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • DriveAdapter.kt
package com.kotdev99.android.c34

/* ์ƒ์† ๋ฐ›์€ ArrayAdapter์™€ ๋™์ผํ•˜๊ฒŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธ
   resId๋Š” ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ ˆ์ด์•„์›ƒ XML ํŒŒ์ผ, datas๋Š” ํ•ญ๋ชฉ์„ ๊ตฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ */
class DriveAdapter(cxt: Context, val resId: Int, val datas: MutableList<DriveVO>) :
	ArrayAdapter<DriveVO>(cxt, resId) {

	override fun getCount(): Int {
		return datas.size
	}

	override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
		var convertView = convertView
		if (convertView == null) {  // ์‚ฌ์šฉํ•  ๋ทฐ ๊ฐ์ฒด๊ฐ€ null ์ด๋ฉด ๋ทฐ ๊ฐ์ฒด ์ƒ์„ฑ
			val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
					as LayoutInflater
			convertView = inflater.inflate(resId, null)
            
            /* LayoutInflater
			   ๊ฐœ๋ฐœ์ž ์ฝ”๋“œ ์ž„์˜ ์ˆœ๊ฐ„ XML ํŒŒ์ผ๋กœ ์ •์˜๋˜์–ด ์žˆ๋Š” ๋ ˆ์ด์•„์›ƒ ๋ฆฌ์†Œ์Šค๋ฅผ
               ์ดˆ๊ธฐํ™”์‹œ์ผœ์„œ ๋ทฐ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. */

			val holder = DriveHolder(convertView)
			convertView!!.tag = holder	// ๋ทฐ ๊ฐ์ฒด์— ํƒœ๊ทธ๋ฅผ ๋ถ™์—ฌ ์ด ํ›„์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
		}

		val holder = convertView.tag as DriveHolder
		val typeImageView = holder.typeImageView
		val titleView = holder.titleView
		val dateView = holder.dateView
		val menuImageView = holder.menuImageView

		// ๋ฐ์ดํ„ฐ ํด๋ž˜์Šค์—์„œ ํ•œ๊บผ๋ฒˆ์— 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๋Š” ์ฝ”๋“œ
		val (type, title, date) = datas[position]
		titleView.text = title
		dateView.text = date
		if (type == "doc") {
			typeImageView.setImageDrawable(
				ResourcesCompat.getDrawable(
					context.resources,
					R.drawable.ic_type_doc, null
				)
			)
		} else if (type == "img") {
			typeImageView.setImageDrawable(
				ResourcesCompat.getDrawable(
					context.resources,
					R.drawable.ic_type_image, null
				)
			)
		} else if (type == "file") {
			typeImageView.setImageDrawable(
				ResourcesCompat.getDrawable(
					context.resources,
					R.drawable.ic_type_file, null
				)
			)
		}
		menuImageView.setOnClickListener {
			Toast.makeText(context, "$title menu click", Toast.LENGTH_SHORT)
				.show()
		}
		return convertView
	}
}

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฉ”์ธ ์•กํ‹ฐ๋น„์—์„œ AdapterView์™€ Adapter๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.

  • MainActivity.kt
package com.kotdev99.android.c34

class MainActivity : AppCompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
		super.onCreate(savedInstanceState)
		setContentView(R.layout.activity_main)

		// ์›๋ณธ ๋ฐ์ดํ„ฐ ์ค€๋น„
		val mutableList = mutableListOf<DriveVO>()
		mutableList.add(DriveVO("์•ˆ๋“œ๋กœ์ด๋“œ", "2์›” 6์ผ", "doc"))
		mutableList.add(DriveVO("db.zip", "2์›” 6์ผ", "file"))
		mutableList.add(DriveVO("์ด๋ฏธ์ง€", "2์›” 6์ผ", "img"))

		val listView = findViewById<ListView>(R.id.custom_listView)
		val adapter = DriveAdapter(this, R.layout.custom_item, mutableList)
		listView.adapter = adapter
	}
}

๊ฒฐ๊ณผ

profile
์‘์•  ๋‚˜ ์•„๊ธฐ ๋‰ด๋น„

0๊ฐœ์˜ ๋Œ“๊ธ€