코틀린

[코틀린] 문제: Kotlin study 07 / The 친절한 코틀린 앱 프로그래밍

edit0 2021. 3. 11. 01:46
  • 레이아웃은 아래 참조
  • '음악 추가' 버튼을 누르면 리사이클러뷰에 아이템(곡명, 가수 이름)이 추가되도록 한다.
  • SongItem 클래스에서 데이터를 담고 있고, song.xml 파일에서 리사이클러뷰 내 아이템 레이아웃을 정의하도록 한다.
  • 리사이클러뷰에 표시된 아이템을 선택하면 곡명과 가수 이름이 토스트 메시지로 표시된다.

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30dp"
        android:text="음악 차트"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.5"
            android:id="@+id/et1"
            android:hint="노래 제목"/>

        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1.5"
            android:id="@+id/et2"
            android:hint="가수 이름"/>

        <Button
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="음악 추가"
            android:id="@+id/b1"/>

    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rcv"/>

</LinearLayout>

 

song.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="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@drawable/song"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:id="@+id/tv1"
                android:textSize="30dp"
                android:gravity="center_vertical"
                android:text="곡명"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:layout_weight="1"
                android:gravity="center_vertical"
                android:id="@+id/tv2"
                android:text="가수"
                android:textSize="20dp"/>

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

 

SongItem.kt (데이터 관리)

class SongItem(
    var Song:String? = null, var Singer_name:String? = null
) {
}

 

인터페이스 OnPersonItemClickListener (아이템 클릭 시 호출)

interface OnPersonItemClickListener {
    fun onItemClick(holder: song_Adapter.ViewHolder?, view: View?, position:Int)
}

 

song_Adapter.kt

class song_Adapter : RecyclerView.Adapter<song_Adapter.ViewHolder>() {

    var items: ArrayList<SongItem> = ArrayList<SongItem>()

    lateinit var listener: OnPersonItemClickListener

    inner class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {

        init {
            itemView.setOnClickListener{
                listener.onItemClick(this, itemView, adapterPosition)
            }
        }

        fun setItems(item: SongItem){
            itemView.tv1.setText(item.Song)
            itemView.tv2.text = item.Singer_name
        }
    }


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): song_Adapter.ViewHolder {
        val itemView = LayoutInflater.from(parent.context).inflate(R.layout.song, parent, false)
        return ViewHolder(itemView)
    }

    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(holder: song_Adapter.ViewHolder, position: Int) {
        var item = items[position]
        holder.setItems(item)
    }
}

 

MainActivity.kt

class MainActivity : AppCompatActivity() {

    var adapter:song_Adapter = song_Adapter()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        rcv.layoutManager = layoutManager
        rcv.adapter = adapter

        b1.setOnClickListener {
            adapter.items.add(SongItem(et1.text.toString(),et2.text.toString()))
            adapter.notifyDataSetChanged()
        }

        adapter.listener = object : OnPersonItemClickListener{
            override fun onItemClick(holder: song_Adapter.ViewHolder?, view: View?, position: Int) {
                Toast.makeText(applicationContext, "${adapter.items[position].Song} \n ${adapter.items[position].Singer_name}",Toast.LENGTH_LONG).show()
            }
        }
    }
}

 

결과