코틀린
[코틀린] 문제: 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()
}
}
}
}
결과