Android - RecyclerView

강민혁·2023년 7월 7일
post-thumbnail

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

RecyclerView?

RecyclerView는 안드로이드에서 리스트와 그리드와 같은 스크롤 가능한 목록을 구현하기 위해 사용되는 고급 위젯입니다. RecyclerView는 ListView와 GridView의 대체제로 소개되었으며, 더 유연하고 성능 향상을 위해 설계되었습니다.

RecyclerView는 아이템 목록을 표시하기 위해 LayoutManager, 아이템 뷰의 모양과 내용을 정의하기 위한 ViewHolder, 그리고 데이터를 관리하고 아이템 뷰에 바인딩하는 Adapter로 구성됩니다. 각각의 역할에 대해 간단히 설명하겠습니다:

  • LayoutManager: RecyclerView에서 아이템을 배치하고 스크롤 동작을 관리하는 역할을 합니다. LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager 등 다양한 레이아웃 매니저를 사용하여 아이템을 수평 또는 수직으로 배치할 수 있습니다.

  • ViewHolder: RecyclerView에서 각각의 아이템을 나타내는 뷰와 데이터를 바인딩하는 역할을 합니다. ViewHolder는 아이템 뷰의 구성 요소들을 참조하고 관리하는 역할을 하며, RecyclerView가 스크롤되거나 재사용될 때 효율적인 뷰 관리를 가능하게 합니다.

  • Adapter: RecyclerView에 데이터를 제공하고 아이템 뷰를 생성하는 역할을 합니다. Adapter는 데이터 세트를 관리하고, 데이터의 변화에 따라 아이템 뷰를 업데이트하며, ViewHolder를 생성하여 아이템 뷰에 바인딩합니다.

RecyclerView는 매우 유연하고 확장 가능한 위젯으로, 대량의 데이터를 효율적으로 표시하고 다양한 레이아웃 및 상호작용 패턴을 구현할 수 있습니다. 개발자는 RecyclerView를 사용하여 다양한 목록 형식의 사용자 인터페이스를 구현할 수 있으며, 커스텀 뷰와 함께 사용하여 다양한 디자인을 구현할 수도 있습니다.

RecyclerView 구현

MainActivity

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

data class SongInfo(val name: String? = null, val title: String? = null) {}

Adapter

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])
    }
}

설명

  1. RecyclerView를 초기화합니다.
  2. LayoutManager를 설정하여 아이템 뷰의 배치 방식을 결정합니다.
  3. Adapter를 생성하고 RecyclerView에 연결합니다.
  4. Adapter에서 데이터를 관리하고 아이템 뷰를 생성합니다.
  5. LayoutManager는 아이템 뷰를 배치하고 스크롤 동작을 관리합니다.
  6. 스크롤 또는 데이터 변경 등의 이벤트가 발생하면 RecyclerView는 Adapter에 이를 통보하고 화면을 업데이트합니다.
  7. Adapter는 변경된 데이터에 따라 아이템 뷰를 업데이트하거나 추가/삭제합니다.
  8. ViewHolder는 아이템 뷰와 데이터를 바인딩하여 화면에 표시합니다.
    사용자 인터랙션 또는 다른 이벤트에 응답하여 Adapter의 데이터를 업데이트하고 화면을 다시 그립니다.
profile
화이팅

0개의 댓글