Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 0 additions & 34 deletions .gitignore

This file was deleted.

49 changes: 0 additions & 49 deletions README.md

This file was deleted.

Empty file removed backy/test.txt
Empty file.
1 change: 1 addition & 0 deletions bongbak/week2/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ android {
}

dependencies {
implementation("com.google.code.gson:gson:2.10.1")
implementation(libs.androidx.core.ktx)
implementation(libs.androidx.appcompat)
implementation(libs.material)
Expand Down
8 changes: 8 additions & 0 deletions bongbak/week2/app/src/main/java/com/example/mission2/Album.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.mission2

data class Album(
var title:String?="",
var singer:String?="",
var coverImg : Int? =null,
var songs: ArrayList<Song>?=null
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@ import androidx.fragment.app.Fragment
import com.example.mission2.databinding.FragmentAlbumBinding
import com.example.mission2.databinding.FragmentSongBinding
import com.google.android.material.tabs.TabLayoutMediator
import com.google.gson.Gson

class AlbumFragment : Fragment() {

private val information=arrayListOf("수록곡","상세정보","영상")

lateinit var binding : FragmentAlbumBinding
private var gson: Gson =Gson()

override fun onCreateView(
inflater : LayoutInflater,
Expand All @@ -30,6 +32,12 @@ class AlbumFragment : Fragment() {
.replace(R.id.main_frm, HomeFragment()).commitAllowingStateLoss()

}


val albumJson=arguments?.getString("album")
val album=gson.fromJson(albumJson,Album::class.java)
setInit(album)

val albumAdapter = AlbumVPAdapter(this,titleFromTextView,composerFromTextView)
binding.albumContentVp.adapter=albumAdapter
TabLayoutMediator(binding.albumContentTb, binding.albumContentVp) { tab, position ->
Expand All @@ -38,4 +46,9 @@ class AlbumFragment : Fragment() {

return binding.root
}
private fun setInit(album:Album){
binding.albumAlbumIv.setImageResource(album.coverImg!!)
binding.albumMusicTitleTv.text=album.title.toString()
binding.albumSingerNameTv.text=album.singer.toString()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.example.mission2

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.mission2.databinding.ItemAlbumBinding

class AlbumRVAdapter(private val albumList:ArrayList<Album>): RecyclerView.Adapter<AlbumRVAdapter.ViewHolder>(){

interface MyItemClickListener{
fun onItemClick(album: Album)
fun onRemoveAlbum(position:Int)
fun onPlayClick(album: Album)
}

private lateinit var myItemClickListener: MyItemClickListener
fun setMyItemClickListener(itemClickListener: MyItemClickListener){
myItemClickListener=itemClickListener
}

fun addItem(album:Album){
albumList.add(album)
notifyDataSetChanged()
}
fun removeItem(position:Int){
albumList.removeAt(position)
notifyDataSetChanged()
}

override fun onCreateViewHolder(
viewGroup: ViewGroup,
viewType: Int
): AlbumRVAdapter.ViewHolder {

val binding: ItemAlbumBinding=ItemAlbumBinding.inflate(LayoutInflater.from(viewGroup.context),viewGroup,false)

return ViewHolder(binding)
}

override fun onBindViewHolder(holder: AlbumRVAdapter.ViewHolder, position: Int) {
holder.bind(albumList[position])
holder.itemView.setOnClickListener { myItemClickListener.onItemClick(albumList[position])}
// holder.binding.itemAlbumTitleTv.setOnClickListener { myItemClickListener.onRemoveAlbum(position) }
}

override fun getItemCount(): Int=albumList.size
inner class ViewHolder(val binding: ItemAlbumBinding): RecyclerView.ViewHolder(binding.root){

fun bind(album:Album){
binding.itemAlbumTitleTv.text=album.title
binding.itemAlbumSingerNameTv.text=album.singer
binding.itemAlbumCoverImgIv.setImageResource(album.coverImg!!)

binding.itemAlbumPlayImgIv.setOnClickListener {
myItemClickListener.onPlayClick(album)
}

}
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,33 @@
package com.example.mission2

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.viewpager2.widget.ViewPager2
import com.example.mission2.databinding.FragmentHomeBinding
import com.google.gson.Gson

class HomeFragment : Fragment() {

lateinit var binding: FragmentHomeBinding
private val albumDatas=ArrayList<Album>()

override fun onAttach(context: Context) {
super.onAttach(context)
if (context is OnSongPlayListener) {
songPlayListener = context
} else {
throw RuntimeException("$context must implement OnSongPlayListener")
}
}
interface OnSongPlayListener {
fun onSongPlayed(title: String?, singer: String?)
}
private lateinit var songPlayListener: OnSongPlayListener

override fun onCreateView(
inflater: LayoutInflater,
Expand All @@ -18,11 +36,37 @@ class HomeFragment : Fragment() {
): View {
binding = FragmentHomeBinding.inflate(inflater, container, false)

binding.homeAlbumImgIv1.setOnClickListener {
(context as MainActivity).supportFragmentManager.beginTransaction()
.replace(R.id.main_frm , AlbumFragment())
.commitAllowingStateLoss()
// binding.homeAlbumImgIv1.setOnClickListener {
// (context as MainActivity).supportFragmentManager.beginTransaction()
// .replace(R.id.main_frm , AlbumFragment())
// .commitAllowingStateLoss()
// }

albumDatas.apply{
add(Album("Butter","방탄소년단(BTS)",R.drawable.img_album_exp))
add(Album("Lilac","아이유(IU)",R.drawable.img_album_exp2))
add(Album("이상비행","한로로(HANRORO)",R.drawable.img_album_exp3))
add(Album("집","한로로(HANRORO)",R.drawable.img_album_exp4))
add(Album("자몽살구클럽","한로로(HANRORO)",R.drawable.img_album_exp5))
add(Album("입춘","한로로(HANRORO)",R.drawable.img_album_exp6))
}
val albumRVAdapter= AlbumRVAdapter(albumDatas)
binding.homeTodayMusicAlbumRv.adapter=albumRVAdapter
binding.homeTodayMusicAlbumRv.layoutManager= LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false)

albumRVAdapter.setMyItemClickListener(object: AlbumRVAdapter.MyItemClickListener{
override fun onItemClick(album:Album) {
changeAlbumFragment(album)
}

override fun onRemoveAlbum(position: Int) {
albumRVAdapter.removeItem(position)
}

override fun onPlayClick(album: Album) {
songPlayListener.onSongPlayed(album.title, album.singer)
}
})

val bannerAdapter= BannerVPAdapter(this)
bannerAdapter.addFragment(BannerFragment(R.drawable.img_home_viewpager_exp))
Expand All @@ -39,5 +83,17 @@ class HomeFragment : Fragment() {

return binding.root
}
private fun changeAlbumFragment(album: Album) {
(context as MainActivity).supportFragmentManager.beginTransaction()
.replace(R.id.main_frm, AlbumFragment().apply {
arguments = Bundle().apply {
val gson = Gson()
val albumJson = gson.toJson(album)
putString("album", albumJson)
}
})
.commitAllowingStateLoss()
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.mission2

data class Included(
var title:String?="",
var singer:String?=""
)
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,24 @@ import androidx.fragment.app.Fragment
import com.example.mission2.databinding.FragmentLockerBinding
import com.google.android.material.tabs.TabLayoutMediator

class LockerFragment : Fragment(){

private val information=arrayListOf("저장한 곡","음악파일","저장앨범")
class LockerFragment : Fragment() {

lateinit var binding: FragmentLockerBinding

private val information = arrayListOf("저장한 곡", "음악파일", "저장앨범")

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentLockerBinding.inflate(inflater, container, false)

binding.lockerPlayAllImgIv.setOnClickListener {
(context as MainActivity).supportFragmentManager.beginTransaction().replace(
R.id.main_frm,
HomeFragment()
).commitAllowingStateLoss()
}
val lockerAdapter = LockerVPAdapter(this)
binding.vpLockerLockerFragment.adapter=lockerAdapter
binding.vpLockerLockerFragment.adapter = lockerAdapter

TabLayoutMediator(binding.lockerContentTb, binding.vpLockerLockerFragment) { tab, position ->
tab.text = information[position]

}.attach()

return binding.root
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.example.mission2

import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.mission2.databinding.ItemSavedBinding

class LockerRVAdapter(private val savedList:ArrayList<Saved>): RecyclerView.Adapter<LockerRVAdapter.ViewHolder>() {
interface OnItemClickListener {
fun onRemoveItem(position: Int)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
val binding: ItemSavedBinding =
ItemSavedBinding.inflate(LayoutInflater.from(parent.context), parent, false)
return ViewHolder(binding)
}
private lateinit var myItemClickListener: OnItemClickListener

fun setOnItemClickListener(itemClickListener: OnItemClickListener){
myItemClickListener=itemClickListener
}


fun removeItem(position:Int){
savedList.removeAt(position)
notifyItemRemoved(position)
notifyItemRangeChanged(position, savedList.size)
}

Comment on lines +24 to +29
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 removeItem()에서 연속으로 호출하고 있는데, notifyItemRemoved(position)만 호출해도 이후 아이템들의 위치가 자동으로 재계산되므로, 일반적으로 notifyItemRangeChanged()는 불필요합니다.

override fun onBindViewHolder(holder: LockerRVAdapter.ViewHolder, position: Int) {

holder.bind(savedList[position])
holder.binding.itemSavedMore01Iv.setOnClickListener {
myItemClickListener.onRemoveItem(position)
}
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

현재 클릭 리스너가 bind() 함수 내부에 설정되어 있는데, onBindViewHolder가 호출되어 bind()가 실행될 때마다, 즉 아이템이 화면에 나타날 때마다 리스너 객체를 새로 생성하여 설정하게 되고 이로 인해 불필요한 객체를 생성하게 된다고 생각합니다. 따라서 ViewHolderinit 블록을 사용하여 클릭 리스너를 한 번만 설정하면 좋을 것 같습니다.


override fun getItemCount(): Int=savedList.size

inner class ViewHolder(val binding: ItemSavedBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(saved: Saved) {
binding.itemSavedMusicTitle01Tv.text = saved.title
binding.itemSavedSingerName01Tv.text = saved.singer
binding.itemSavedCoverIv.setImageResource(saved.coverImg!!)
}
}
}
Loading