이번 포스팅에서는 안드로이드 RecyclerView에 대해서 작성해보겠습니다.

RecyclerView는 안드로이드에서 리스트와 그리드와 같은 스크롤 가능한 목록을 구현하기 위해 사용되는 고급 위젯입니다. RecyclerView는 ListView와 GridView의 대체제로 소개되었으며, 더 유연하고 성능 향상을 위해 설계되었습니다.
RecyclerView는 아이템 목록을 표시하기 위해 LayoutManager, 아이템 뷰의 모양과 내용을 정의하기 위한 ViewHolder, 그리고 데이터를 관리하고 아이템 뷰에 바인딩하는 Adapter로 구성됩니다. 각각의 역할에 대해 간단히 설명하겠습니다:
LayoutManager: RecyclerView에서 아이템을 배치하고 스크롤 동작을 관리하는 역할을 합니다. LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager 등 다양한 레이아웃 매니저를 사용하여 아이템을 수평 또는 수직으로 배치할 수 있습니다.
ViewHolder: RecyclerView에서 각각의 아이템을 나타내는 뷰와 데이터를 바인딩하는 역할을 합니다. ViewHolder는 아이템 뷰의 구성 요소들을 참조하고 관리하는 역할을 하며, RecyclerView가 스크롤되거나 재사용될 때 효율적인 뷰 관리를 가능하게 합니다.
Adapter: RecyclerView에 데이터를 제공하고 아이템 뷰를 생성하는 역할을 합니다. Adapter는 데이터 세트를 관리하고, 데이터의 변화에 따라 아이템 뷰를 업데이트하며, ViewHolder를 생성하여 아이템 뷰에 바인딩합니다.
RecyclerView는 매우 유연하고 확장 가능한 위젯으로, 대량의 데이터를 효율적으로 표시하고 다양한 레이아웃 및 상호작용 패턴을 구현할 수 있습니다. 개발자는 RecyclerView를 사용하여 다양한 목록 형식의 사용자 인터페이스를 구현할 수 있으며, 커스텀 뷰와 함께 사용하여 다양한 디자인을 구현할 수도 있습니다.
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.myblock.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var adapter: Adapter
private val list = mutableListOf<SongInfo>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
adapter = Adapter(createList())
binding.recyclerView.layoutManager = LinearLayoutManager(this@MainActivity)
binding.recyclerView.adapter = adapter
binding.addBtn.setOnClickListener {
val newSong = SongInfo(binding.songName.text.toString(), binding.songName2.text.toString())
list.add(newSong)
adapter.notifyItemInserted(list.lastIndex)
}
}
private fun createList(): List<SongInfo> {
list.add(SongInfo("first song", "first song"))
return list
}
}
data class SongInfo(val name: String? = null, val title: String? = null) {}
package com.example.myblock
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.myblock.databinding.ItemBinding
class Adapter(private val songList: List<SongInfo>): RecyclerView.Adapter<Adapter.ViewHolder>() {
inner class ViewHolder(val binding: ItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun setData(songList: SongInfo){
binding.songNameResult.text = songList.name
binding.songNameResult2.text = songList.title
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder =
ViewHolder(ItemBinding.inflate(LayoutInflater.from(parent.context),parent,false))
override fun getItemCount(): Int {
return songList.size
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.setData(songList[position])
}
}