2024. 4. 9. 16:20, ๐ฑAndroid Study
๋ฐ์ํ
ListView
1. ๋ฆฌ์คํธ๋ทฐ(ListView)
- ListView๋ ์ด๋ํฐ ๋ทฐ์ ๋ํ ์์ ฏ์ผ๋ก์, ๋ณต์ ๊ฐ์ ํญ๋ชฉ์ ์์ง์ผ๋ก ํ์
2. ๋ฆฌ์คํธ๋ทฐ ์ค์ ์ ์ฐจ
- ์ฌ์ฉํ ๋ ์ด์์์ ListView ์์ ฏ ์ ์ (XML์ฝ๋)
- ์ด๋ํฐ ๊ฐ์ฒด ์์ฑ (Kotlin ์ฝ๋)
- ListView ๊ฐ์ฒด์ ์ด๋ํฐ ์ฐ๊ฒฐ (Kotlin ์ฝ๋)
2-1. ์ฌ์ฉํ ๋ ์ด์์์ ListView์์ ฏ ์ ์
- ์ฌ์ฉํ ๋ ์ด์์ XML์ ListView์์ ฏ์ ์ถ๊ฐ
- XML๋ ์ด์์ ํ์ผ์ ์ ์๋ ListView ์์ ฏ์ ์ฝํ๋ฆฐ ์ฝ๋์์ ์ฐธ์กฐํ๊ธฐ ์ํ์ฌ id์์ฑ์ ์ ์ํจ
~.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView // ๋ฆฌ์คํธ๋ทฐ ์ถ๊ฐ
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</LinearLayout>
2-2. ์ด๋ํฐ ๊ฐ์ฒด ์์ฑ
- ๋ฐ์ดํฐ ์๋ณธ์ด ๋ฐฐ์ด(Array)์ธ ๊ฒฝ์ฐ์ ArrayAdapter๊ฐ์ฒด ์ฌ์ฉ
- ArrayAdapter ์์ฑ์
ArrayAdapter(Context context, int textViewResourceId, T[] objects)- context: ํ์ฌ ์ปจํ ์คํธ
- resource: ํญ๋ชฉ์ผ๋ก ํ์๋ ํ ์คํธ ๋ทฐ์ ๋ฆฌ์์ค ID
- objects: ์ด๋ํฐ๋ก ๊ณต๊ธ๋ ๋ฐ์ดํฐ ์๋ณธ์ผ๋ก ๋จ์ ๋ฐฐ์ด
string ๋ฐฐ์ด์ ์ด์ฉํ ArrayAdapter ๊ฐ์ฒด ์์ฑ ์์
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// ๋ฐ์ดํฐ ์๋ณธ ์ค๋น
val items = arrayOf<String?>("item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8")
//์ด๋ํฐ ์ค๋น (๋ฐฐ์ด ๊ฐ์ฒด ์ด์ฉ, simple_list_item_1 ๋ฆฌ์์ค ์ฌ์ฉ
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)
}
}
2-3. ๋ฆฌ์คํธ๋ทฐ ๊ฐ์ฒด์ ์ด๋ํฐ ์ฐ๊ฒฐ
- ํ์ฌ ํ๋ฉด ๋ ์ด์์ XML์ ์ ์ ๋ ๋ทฐ ์ค์์, id๊ฐ listView์ธ ListView๊ฐ์ฒด๋ฅผ ViewBinding์ ํตํด์ ์ป์ด์ด
- ์ป์ด ์จ ListView๊ฐ์ฒด์ ์์ฑ๋ ์ด๋ํฐ ๊ฐ์ฒด(์: ArrayAdapter๊ฐ์ฒด - adapter)๋ฅผ ์ฐ๊ฒฐ
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// ๋ฐ์ดํฐ ์๋ณธ ์ค๋น
val items = arrayOf<String?>("item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8")
//์ด๋ํฐ ์ค๋น (๋ฐฐ์ด ๊ฐ์ฒด ์ด์ฉ, simple_list_item_1 ๋ฆฌ์์ค ์ฌ์ฉ
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)
// ์ด๋ํฐ๋ฅผ ListView ๊ฐ์ฒด์ ์ฐ๊ฒฐ
binding.listView.adapter = adapter
}
}
GridView
1. ๊ทธ๋ฆฌ๋๋ทฐ (GridView)
- GridView๋ 2์ฐจ์ ์คํฌ๋กค ๊ฐ๋ฅํ ๊ทธ๋ฆฌ๋์ ํญ๋ชฉ์ ํ์
2. ๊ทธ๋ฆฌ๋๋ทฐ ์ค์ ์ ์ฐจ
- ์ฌ์ฉํ ๋ ์ด์์์ GridView์์ ฏ ์ ์ (XML์ฝ๋)
- ArrayAdapter๊ฐ์ฒด๋ฅผ ์์ฑ
- GridView๊ฐ์ฒด์ ์ฐ๊ฒฐ (Kotlin ์ฝ๋)
2-1. ์ฌ์ฉํ ๋ ์ด์์์ GridView์์ ฏ ์ ์
- ์ฌ์ฉํ ๋ ์ด์์(์: activity_main.xml)์ GridView์์ ฏ์ ์ถ๊ฐ
- XML๋ ์ด์์ ํ์ผ์ ์ ์๋ GridView ์์ ฏ์ Kotlin์ฝ๋์์ ์ฐธ์กฐํ๊ธฐ ์ํ์ฌ id์์ฑ์ ์ ์
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="100dp"
android:numColumns="auto_fit"
android:verticalSpacing="10dp"
android:horizontalSpacing="10dp"
android:stretchMode="columnWidth"
android:gravity="center"
/>
- android:columnWidth="100dp" : ๊ทธ๋ฆฌ๋ ํญ๋ชฉ ํ๋์ ํญ์ 100dp๋ก ์ค์
- android:numColumns="auto_fit”: ์ด์ ํญ๊ณผ ํ๋ฉด ํญ์ ๋ฐํ์ผ๋ก ์๋ ๊ณ์ฐ
- android:verticalSpacing: ํญ๋ชฉ ๊ฐ์ ๊ฐ๊ฒฉ ์ค์
- android:stretchMode="columnWidth": ์ด ๋ด๋ถ์ ์ฌ๋ฐฑ์ ํญ์ ๋ง๊ฒ ์ฑ์
2-2/3. ArrayAdapter๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ GridView๊ฐ์ฒด์ ์ฐ๊ฒฐ
- ArrayAdapter ๊ฐ์ฒด๋ฅผ ์์ฑ
- id๋ฅผ ๋ฐํ์ผ๋ก ๋ฉ์ธํ๋ฉด ๋ ์ด์์(activity_main.xml)์ ์ ์๋ GridView ๊ฐ์ฒด ๋ก๋ฉ
- ์์ฑ๋ ArrayAdapter ๊ฐ์ฒด๋ฅผ GridView ๊ฐ์ฒด์ ์ฐ๊ฒฐ
- ๋ฆฌ์คํธ๋ทฐ ๋ง๋ค์๋ ๋ฐฉ๋ฒ๊ณผ ๋๊ฐ์!
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// ๋ฐ์ดํฐ ์๋ณธ ์ค๋น
val items = arrayOf<String?>("item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8", "item5", "item6", "item7", "item8")
//์ด๋ํฐ ์ค๋น (๋ฐฐ์ด ๊ฐ์ฒด ์ด์ฉ, simple_list_item_1 ๋ฆฌ์์ค ์ฌ์ฉ
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, items)
// ์ด๋ํฐ๋ฅผ GridView ๊ฐ์ฒด์ ์ฐ๊ฒฐ
binding.gridView.adapter = adapter
}
}
3. ์ด๋ฏธ์ง ๊ทธ๋ฆฌ๋ ๋ทฐ ์ค์ ์ ์ฐจ
- ๋ฐฉ์์ ์ผ๋ฐ ๊ทธ๋ฆฌ๋ ๋ทฐ์ ๋๊ฐ์ (๋ ์ด์์ XML์ฝ๋ ์์ฑ, ์ด๋ํฐ ์ ์, ์ด๋ํฐ ์ฐ๊ฒฐ)
- ํ์ง๋ง ์ด๋ํฐ ์ ์๊ฐ ๋ค๋ฆ
XML ํ์ผ : ๊ธฐ์กด ๊ทธ๋ฆฌ๋๋ทฐ ์์ฑ๊ณผ ๋์ผ
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:columnWidth="100dp"
android:gravity="center"
android:horizontalSpacing="10dp"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:verticalSpacing="10dp" />
์ด๋ํฐ ์ ์ : ๊ธฐ์กด ๊ทธ๋ฆฌ๋๋ทฐ์ ๋ค๋ฆ
class ImageAdapter : BaseAdapter() {
override fun getCount(): Int {
return mThumbIds.size
}
override fun getItem(position: Int): Any {
return mThumbIds[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val imageView: ImageView
if (convertView == null) {
imageView = ImageView(parent!!.context)
imageView.layoutParams = AbsListView.LayoutParams(200, 200)
imageView.scaleType = ImageView.ScaleType.CENTER_CROP
imageView.setPadding(8, 8, 8, 8)
} else {
imageView = convertView as ImageView
}
imageView.setImageResource(mThumbIds.get(position))
return imageView
}
private val mThumbIds = arrayOf<Int>(
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7,
R.drawable.sample_0, R.drawable.sample_1,
R.drawable.sample_2, R.drawable.sample_3,
R.drawable.sample_4, R.drawable.sample_5,
R.drawable.sample_6, R.drawable.sample_7
)
}
- ๊ทธ๋ฆฌ๋ ๋ทฐ์ ํญ๋ชฉ์ผ๋ก ๊ฐ๋จํ ํ
์คํธ๊ฐ ์๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ์๋
๊ทธ๋ฆฌ๋๋ทฐ์ ํญ๋ชฉ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๊ณต๊ธํ๋ ImageAdapter๋ฅผ BaseAdapter๋ก๋ถํฐ ํ์ํ์ฌ ์ ์ - app>res>drawable ํ์์ ์ด๋ฆ์ด sample_0์์ sample_7๊น์ง์ธ 8๊ฐ์ ์ด๋ฏธ์ง ํ์ผ์ ์ถ๊ฐ
- ImageAdapter๊ฐ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ๋ ํธ์์ ์ง์ ImageAdapter ๋ด๋ถ์ Image ๋ฆฌ์์ค ID์ ๋ฐฐ์ด๋ก ์ค์
- BaseAdapter์ getCount(), getItem(), **getItemId()**, **getView()** ๋ฉ์๋๋ฅผ ์ฌ์ ์ํจ
- getCount() : ํญ๋ชฉ์ ์ด ๊ฐ์๋ฅผ ๋ฐํํ๊ธฐ ์ํด mThumbIds ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ๋ฐํ
- getItem() : ํน์ ์์น์ ํญ๋ชฉ์ ๋ฐํํ๊ธฐ ์ํด mThumbIds ๋ฐฐ์ด์ ์ง์ ๋ ์์น์ ํญ๋ชฉ์ ๋ฐํ
- getItemId() : ํน์ ์์น์ ํญ๋ชฉ ์์ด๋๋ฅผ ๋ฐํ, ์ฌ๊ธฐ์๋ ๋ฐฐ์ด์ ์์น(์์)๋ฅผ ํญ๋ชฉ์ ์์ด๋๋ก ๊ฐ์ฃผ
- getView() : ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ์ฃผ์ด์ง ์์น์ ํญ๋ชฉ ๋ทฐ๋ฅผ ๋ฐํ
mThumbIds ๋ฐฐ์ด์ position ์์น์ ์๋ ์ด๋ฏธ์ง ๋ฆฌ์์ค๋ฅผ ImageView์ ์ด๋ฏธ์ง๋ก ์ค์
์ค์ ๋ ImageView ๊ฐ์ฒด๋ฅผ ๊ทธ๋ฆฌ๋ ๋ทฐ์ ํญ๋ชฉ๋ทฐ๋ก ๋ฐํ - getView() ๋ฉ์๋์ ๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ convertView๋ ์ด์ ์ ์์ฑ๋ ํญ๋ชฉ๋ทฐ (์ฌ๊ธฐ์๋ ImageView)๋ฅผ ์๋ฏธ
๋ง์ฝ ํด๋น ์์น์ ํญ๋ชฉ๋ทฐ๊ฐ ์ฒ์ ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ๋ผ๋ฉด, ์๋ก์ด ์ด๋ฏธ์ง๋ทฐ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ ํฌ๊ธฐ, ์ค์ผ์ผํ์ , ํจ๋ฉ ์ค์
๋ง์ฝ ์ด์ ์ ์ด๋ฏธ ๋ง๋ค์ด์ง ๊ฒ์ด๋ผ๋ฉด, ์ด๋ฅผ ์ฌ์ฌ์ฉ - ์ด๋ฏธ์ง ๋ทฐ์ scaleType์ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ์ด๋ฏธ์ง ๋ทฐ์ ๋ง๊ฒ ํ๋ ๋ฐ ์ถ์์ํฌ ๋, ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง๋ฅผ ์ง์ ํ๋ ๊ฒ์ธ๋ฐ, ์ฌ๊ธฐ์ CENTER_CROP์ ์ข
ํก๋น๋ฅผ ์ ์งํ์ฌ ์ค์ผ์ผ๋งํ๋ฉฐ ๋ทฐ์ ํฌ๊ธฐ ์ด์์ผ๋ก ์ฑ์ฐ๊ฒ ๋จ์ ์๋ฏธ
๋ฐ๋ผ์ ์ด๋ฏธ์ง ์ผ๋ถ๊ฐ ์๋ฆด ์ ์์
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// ImageAdapter ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ GridView ๊ฐ์ฒด์ ์ฐ๊ฒฐ
binding.gridview.adapter = ImageAdapter()
}
}
4. ํญ๋ชฉ ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ
- AdapterView์ ํญ๋ชฉ์ด ํด๋ฆญ ๋ ๋, ํธ์ถ๋๋ callbackmethod์ ์ธํฐํ์ด์ค
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// ImageAdapter ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ GridView ๊ฐ์ฒด์ ์ฐ๊ฒฐ
binding.gridview.adapter = ImageAdapter()
// ํญ๋ชฉ ํด๋ฆญ ์ด๋ฒคํธ ์ฒ๋ฆฌ
binding.gridview.setOnItemClickListener{ parent, view, position, id ->
Toast.makeText(this@MainActivity,"" + (position + 1) + "๋ฒ์งธ ์ ํ",
Toast.LENGTH_SHORT).show()
}
}
}
๋ฐ์ํ
๐ฌ C O M M E N T