๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/Android

[Android] RecyclerView - notifyDataSetChanged()

interfacer_han 2024. 2. 28. 12:34

#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