#1 ์ด์ ๊ธ
[Android] RecyclerView - Adapter์ ์ธ์(Argument) ์ ๋ฌ
#1 ์ด์ ๊ธ [Android] RecyclerView - ๊ธฐ์ด#1 ListView vs RecyclerView ํ๋ฉด์ ์์(Item)์ 100๊ฐ ํํํ๋ค๊ณ ํด๋ณด์. ListView๋ GridView ๋ฑ์ ์ ํต์ ์ธ Container Widget๋ค์ ์ด 100๊ฐ์ ์์ดํ ์ ๋ชจ๋ ๋ถ๋ฌ์จ(load)๋ค. ๊ทธ
kenel.tistory.com
์ด์ ๊ฒ์๊ธ์์ Item์ List๋ฅผ Adapter์ ์ธ์๋ก ์ ๋ฌํ์๋ค. ์ด ๋, ์ ๊ฒ์๊ธ์ ์์ฑ๋ ์ฑ์ ์์ ํด์ Item์ List๊ฐ ์ฌ๋ฌ ๋ฒ ๋ฐ๋๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด๊ฒ ๋ค.
#2 Item์ List์ ๋น๋ฒํ ๋ณ๊ฒฝ
#2-1 ๊ฐ์
์์ ๊ฐ์ด ๋งจ ์์ ๋ฒํผ์ ๋๋ฅด๋ฉด, RecyclerView์ Item์ด ํ๋์ฉ ๋๋ค์ผ๋ก ์ถ๊ฐ๋๊ฒ ์ฑ์ ์์ ํ๋ค.
#2-2 Activity ์์ (MainActivity.kt)
// package com.example.notifydatasetchanged
import android.os.Bundle
import android.widget.Button
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
class MainActivity : AppCompatActivity() {
companion object {
val availableBurgerList = listOf<Menu>(
Menu("Classic Cheeseburger", 6800),
Menu("Bacon Deluxe Burger", 7800),
Menu("BBQ Ranch Burger", 5800),
Menu("Mushroom Swiss Burger", 6700),
Menu("Double Stack Burger", 9800),
Menu("Spicy Chicken Burger", 7900),
Menu("Crispy Chicken Burger", 6800),
Menu("Grilled Chicken Club", 9700),
Menu("Veggie Burger Deluxe", 6800),
Menu("Hawaiian Teriyaki Burger", 8900),
Menu("Philly Cheese Steak Burger", 6200),
Menu("Western BBQ Burger", 7300),
Menu("Jalapeno Pepper Jack Burger", 7900),
Menu("Turkey Avocado Burger", 6700),
Menu("Black Bean Burger", 7600),
Menu("Bacon Jalapeno Burger", 6700),
Menu("Ultimate BBQ Bacon Burger", 6700),
Menu("Chicken Bacon Ranch Burger", 6700),
Menu("Chipotle Guacamole Burger", 6700),
Menu("Breakfast Burger", 4700),
)
}
val burgers = ArrayList<Menu>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyRecyclerViewAdapter(burgers) { menu: Menu -> itemClicked(menu) }
val addBurgerButton = findViewById<Button>(R.id.addBurgerButton)
addBurgerButton.setOnClickListener {
burgers.add(availableBurgerList.random())
recyclerView.adapter = MyRecyclerViewAdapter(burgers) { menu: Menu -> itemClicked(menu) }
}
}
private fun itemClicked(menu: Menu) {
Toast.makeText(
this, "Selected Menu is ${menu.name}", Toast.LENGTH_LONG
).show()
}
}
burgers๊ฐ ๋ณํ ์ ์์ด์ผํ๋ค. ๋ฐ๋ผ์ ์์ ์ญ์ ๋ฐ ์ถ๊ฐ๊ฐ ๋ถ๊ฐ๋ฅํ List์์ ArrayList๋ก burgers์ ๋ฐ์ดํฐ ํ์ ์ ๋ฐ๊ฟจ๋ค.
#2-3 ๋ฌธ์ ์
์ ์ฝ๋๋ Item์ด ๋ณ๋๋ ๋๋ง๋ค, ์ฆ ๋ฒํผ์ ๋๋ฅผ ๋๋ง๋ค Adapter๊ฐ ์๋ก ์์ฑํ๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ญ๋น๋ค. Adapter๋ ์ด๋ ๊ฒ ๋ง์ด ์์ฑ๋ ์ด์ ๊ฐ ์๋ ๊ฐ์ฒด๋ค.
#3 notifyDataSetChanged()
#3-1 ๊ฐ์
RecyclerView.Adapter | Android Developers
androidx.appsearch.builtintypes.properties
developer.android.com
์ด ๋ฌธ์ ์ ์ ํด๊ฒฐํ ์ ์๋ ๋ฉ์๋๊ฐ RecyclerView.Adapter.notifyDataSetChanged()๋ค. ์ด ๋ฉ์๋๋ Adapter ๋ด๋ถ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋, ํด๋น ๋ณ๊ฒฝ์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ๋ค. ์๋๋ notifyDataSetChanged() ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ณผ์ ์ด๋ค.
#3-2 Adapter ์์ (MyRecyclerViewAdapter.kt)
...
class MyRecyclerViewAdapter(val clickListener: (Menu) -> Unit) :
RecyclerView.Adapter<MyViewHolder>() {
var menus = ArrayList<Menu>()
...
}
Adapter์ ๋งค๊ฐ๋ณ์์ด์ ํ๋กํผํฐ์๋ burgers๋ฅผ, ๋งค๊ฐ๋ณ์์์ ์ ์ธํ๊ณ Adapter์ ํ๋กํผํฐ๋ก๋ง ๋๋ค.
#3-3 Activity ์ฌ์์ (MainActivity.kt)
...
class MainActivity : AppCompatActivity() {
companion object {
val availableBurgerList = listOf<Menu>(
...
)
}
val adapter = MyRecyclerViewAdapter { menu: Menu -> itemClicked(menu) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
val addBurgerButton = findViewById<Button>(R.id.addBurgerButton)
addBurgerButton.setOnClickListener {
adapter.menus.add(availableBurgerList.random())
adapter.notifyDataSetChanged()
}
}
private fun itemClicked(menu: Menu) {
Toast.makeText(
this, "Selected Menu is ${menu.name}", Toast.LENGTH_LONG
).show()
}
}
๋จผ์ , burgers ํ๋กํผํฐ๋ ์ด์ Adapter์ ์์ผ๋ฏ๋ก, Activity์ burgers ํ๋กํผํฐ๋ ์ ๊ฑฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๊ฑฐํ Activity์ burgers ํ๋กํผํฐ์ add()๋ฅผ ์ํํ๋ ๋ฒํผ ํด๋ฆญ๋ฆฌ์ค๋๋ฅผ, Adapter์ burgers ํ๋กํผํฐ์ add()๋ฅผ ์ํํ๋๋ก ์์ ํ๋ค. ๋ง์ง๋ง์ผ๋ก, ๋ฒํผ ํด๋ฆญ๋ฆฌ์ค๋์ RecyclerView.Adapter.notifyDataSetChanged()๋ฅผ ๋ฃ์ด์ค๋ค. ์ด๋ฌ๋ฉด #2-2์ ๊ฐ์ ๋์์ ์ํํ๋ฉด์๋, Adapter ์ธ์คํด์ค๊ฐ ์์ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ ๊ฒ ๋จน๋๋ค.
#3-4 ๋น์ทํ ๋ฉ์๋๋ค
RecyclerView.Adapter | Android Developers
androidx.appsearch.builtintypes.properties
developer.android.com
notifyDataSetChanged()๋ณด๋ค ๋ ์ธ๋ถ์ ์ธ ๋ณ๊ฒฝ์ ๋ํ ์ฒ๋ฆฌ ๋ฉ์๋๋ค๋ ์กด์ฌํ๋ค. ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ผ๊ธฐ ์ํด์๋ผ๋ฉด ์ ๋งํฌ์์ ํด๋น ๋ฉ์๋๋ค์ ์ฐพ์ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค. ๊ฐ๋ น, notifyItemInserted(Int) (์์ดํ ์ถ๊ฐ), notifyItemRemoved(Int) (์์ดํ ์ญ์ ), notifyItemChanged(Int) (์์ดํ ์ ๋ฐ์ดํธ)๋ฅผ ์ฐ๋ฉด ๋๋ค. Intํ ์ธ์๋ ํด๋น ์์ ๋ค์ด ์ํ๋ Item์ Index๋ค.
#4 ์์ฝ
RecyclerView.Adapter๋ ๊ทธ ์ธ์คํด์ค๊ฐ ๋ง์ ์ด์ ๊ฐ ์๋ ํด๋์ค๋ค.
#5 ์์ฑ๋ ์ฑ
android-practice/recycler-view/NotifyDataSetChanged at master · Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] Room - AutoMigration ๊ธฐ์ด (0) | 2024.05.06 |
---|---|
[Android] Room - ๋ฐํ ๊ฐ์ด ์๋ INSERT (0) | 2024.02.29 |
[Android] ViewModel - View์ Event ๋ฐ์์ํค๊ธฐ (0) | 2024.02.27 |
[Android] Room - UPDATE ์ฐ์ต (0) | 2024.02.26 |
[Android] Room - Entity, DAO, Database (0) | 2024.02.24 |