[Android/Kotlin 09] ์ข‹์•„์š”๐Ÿ‘ ์•„์ด์ฝ˜ ํด๋ฆญ ์ด๋ฒคํŠธ

์ด๋‹ค์„ยท2023๋…„ 9์›” 7์ผ
1

์•ฑ์„ ์ œ์ž‘ํ•  ๋•Œ ๋น ์งˆ ์ˆ˜ ์—†๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ "์ข‹์•„์š”"๋ฒ„ํŠผ, ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žกํ•œ ์ฝ”๋“œ ๊ตฌ์„ฑ์ด์ง€๋งŒ ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด์„œ ์„ฑ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ํด๋ฆญํ•œ ์•„์ดํ…œ์˜ ์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ "์ข‹์•„์š”" ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋Œ์•„์™€์„œ ํ•ด๋‹น ๋ณ€๊ฒฝ์„ ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ๋ฐ˜์˜ํ•˜๋Š” ๊ณผ์ •๋“ค์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ”— ์ „์ฒด์ฝ”๋“œ github

๐Ÿ“Œ ์ˆœ์„œ

๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ ์•„์ดํ…œ ํด๋ฆญ -> ํด๋ฆญ๋œ ๋ฐ์ดํ„ฐ ์ƒ์„ธํŽ˜์ด์ง€๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ -> ์ƒ์„ธํŽ˜์ด์ง€์—์„œ ์ข‹์•„์š” ์•„์ด์ฝ˜ ํด๋ฆญ -> ์ข‹์•„์š” ์•„์ด์ฝ˜, ์ข‹์•„์š” ์นด์šดํŠธ ๋ฐ์ดํ„ฐ ๋ฉ”์ธ์œผ๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ -> ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ›์•„์™€ ๋ฉ”์ธ์— ๋™์ผํ•˜๊ฒŒ ๋„˜๊ฒจ์ฃผ๊ธฐ


๐Ÿ“Œ MainActivity

๐Ÿ‘‰ ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ ์•„์ดํ…œ ํด๋ฆญ

adapter.itemClick = object : MyAdapter.ItemClick {
  override fun onClick(view: View, position: Int) {
  	// ํด๋ฆญํ•œ ์•„์ดํ…œ์˜ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
    val clickedItem = dataList[position]
    // ๋””ํ…Œ์ผ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
    val intent = Intent(this@MainActivity, DetailActivity::class.java)
    intent.putExtra("likePosition", position) // ์•„์ดํ…œ์˜ ์œ„์น˜ ์ •๋ณด ์ „๋‹ฌ
    intent.putExtra("myItem", clickedItem) // ํด๋ฆญํ•œ ์•„์ดํ…œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ
    activityResultLauncher.launch(intent) // ๋””ํ…Œ์ผ ์•กํ‹ฐ๋น„ํ‹ฐ ์‹คํ–‰
  }
}
  • adapter.itemClick์„ ํ†ตํ•ด ๋ฆฌ์‚ฌ์ดํด๋Ÿฌ๋ทฐ์˜ ์•„์ดํ…œ ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋””ํ…Œ์ผ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด Intent๋ฅผ ์ƒ์„ฑํ•˜๊ณ , likePosition๊ณผ myItem ํ‚ค๋กœ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ ๋””ํ…Œ์ผ ์•กํ‹ฐ๋น„ํ‹ฐ(DetailActivity)์—์„œ ์˜จ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
    if (it.resultCode == RESULT_OK) {
        val likePosition = it.data?.getIntExtra("likePosition", 0) as Int
        val isLiked = it.data?.getBooleanExtra("isLiked", false) as Boolean
        // ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ
        if (isLiked) {
            dataList[likePosition].isLiked = true
            dataList[likePosition].likeCount += 1
        } else {
            if (dataList[likePosition].isLiked) {
                dataList[likePosition].isLiked = false
                dataList[likePosition].likeCount -= 1
            }
        }
        // ์–ด๋Œ‘ํ„ฐ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์•Œ๋ฆฌ๊ธฐ
        adapter.notifyItemChanged(likePosition)
    }
}
  • registerForActivityResult๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋””ํ…Œ์ผ ์•กํ‹ฐ๋น„ํ‹ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋””ํ…Œ์ผ ์•กํ‹ฐ๋น„ํ‹ฐ์—์„œ ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ(likePosition๊ณผ isLiked)๋ฅผ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ dataList์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ , adapter.notifyItemChanged(likePosition)๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น ์•„์ดํ…œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์–ด๋Œ‘ํ„ฐ์— ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

๐Ÿ“Œ DetailActivity

DetailActivity๋Š” ์•„์ดํ…œ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ณ , ์ข‹์•„์š”(๊ด€์‹ฌ) ์ƒํƒœ๋ฅผ ํ† ๊ธ€ํ•˜๋ฉฐ, ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ๋ฉ”์ธ ์•กํ‹ฐ๋น„ํ‹ฐ๋กœ ๋Œ์•„๊ฐˆ ๋•Œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ onCreate ๋ฉ”์„œ๋“œ

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    // XML ๋ ˆ์ด์•„์›ƒ๊ณผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ™”๋ฉด ์„ค์ •
    binding = ActivityDetailBinding.inflate(layoutInflater)
    setContentView(binding.root)

    // MainActivity๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋œ MyItem ๊ฐ์ฒด ๋ฐ›๊ธฐ
    val receivedItem = intent.getParcelableExtra<MyItem>("myItem")

    // MyItem ๊ฐ์ฒด๊ฐ€ ์ „๋‹ฌ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ์„ค์ •
    receivedItem?.let {
        // ํ™”๋ฉด์— ๋ฐ์ดํ„ฐ ์„ค์ •
        binding.detailImage.setImageResource(it.listImage)
        binding.nickname.text = it.nickname
        binding.address.text = it.listAddress
        binding.detailTitle.text = it.listTitle
        binding.detailContent.text = it.detailContent
        binding.price.text = it.listPrice

        // ์ข‹์•„์š”(๊ด€์‹ฌ) ์ƒํƒœ ์„ค์ •
        isLiked = it.isLiked == true
        binding.detailLikeIcon.setImageResource(if (isLiked) {R.drawable.love_filled} else {R.drawable.love_empty})

        // ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ข…๋ฃŒ
        binding.backButton.setOnClickListener {
            exit()
        }

        // ์ข‹์•„์š”(๊ด€์‹ฌ) ์•„์ด์ฝ˜ ํด๋ฆญ ์‹œ ํ† ๊ธ€ํ•˜๊ณ  ์Šค๋‚ต๋ฐ” ํ‘œ์‹œ
        binding.detailLikeIcon.setOnClickListener {
            isLiked = if (!isLiked) {
                binding.detailLikeIcon.setImageResource(R.drawable.love_filled)
                Snackbar.make(binding.constLayout, "๊ด€์‹ฌ ๋ชฉ๋ก์— ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.", Snackbar.LENGTH_SHORT).show()
                isLiked = true
            } else {
                binding.detailLikeIcon.setImageResource(R.drawable.love_empty)
                isLiked = false
            }
        }
    }
}
  • MainActivity์—์„œ ์ „๋‹ฌ๋œ myItem Extra๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ receivedItem์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • isLiked ๋ณ€์ˆ˜๋Š” ์•„์ดํ…œ์˜ ์ข‹์•„์š”(๊ด€์‹ฌ) ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ํด๋ฆญ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ํ† ๊ธ€๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ exit ๋ฉ”์„œ๋“œ ๐Ÿ‘€์ค‘์š”!

private fun exit() {
    // MainActivity๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ Intent ์ƒ์„ฑ
    val likePosition = intent.getIntExtra("likePosition", 0)
    val intent = Intent(this, MainActivity::class.java).apply {
        putExtra("likePosition", likePosition)
        putExtra("isLiked", isLiked)
    }

    // ๊ฒฐ๊ณผ ์„ค์ • ๋ฐ ์•กํ‹ฐ๋น„ํ‹ฐ ์ข…๋ฃŒ
    setResult(RESULT_OK, intent)
    if (!isFinishing) finish()
}
  • exit ๋ฉ”์„œ๋“œ๋Š” ํ˜„์žฌ ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— MainActivity๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • likePosition๊ณผ isLiked ๊ฐ’์„ Intent์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • setResult๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MainActivity์—๊ฒŒ ๊ฒฐ๊ณผ๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ์•กํ‹ฐ๋น„ํ‹ฐ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ onBackPressed ๋ฉ”์„œ๋“œ

override fun onBackPressed() {
    exit()
}
  • ๋’ค๋กœ๊ฐ€๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ exit ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋™์ผํ•œ ์ข…๋ฃŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
profile
๋‚˜๋„ ๊ฐœ๋ฐœ ํ• ๋ž˜

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

comment-user-thumbnail
2023๋…„ 9์›” 7์ผ

์˜ค ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์‹ ๊ฑฐ ๊ฐ™์•„์š”. ์ €๋Š” ์‹œ๋„๋„ ๋ชปํ•ด๋ดค๋Š”๋ฐ ๋„์›€์ด ๋งŽ์ด ๋˜๊ฒ ์–ด์š”! ๊ฒŸํ•ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค~~

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ