기술(Tech, IT)/안드로이드(Android)

[Android] RecyclerView (리싸이클러 뷰) - 2

Daniel803 2024. 9. 28. 05:13

텍스트 아이템 목록을 보여주는 안드로이드의 RecyclerView 구현이다. 이 예제에서 RecyclerView를 설정과 사용자 지정 어댑터를 구현하고, ViewHolder를 생성하는 방법을 보여준다. 필요에 따라 더 복잡한 레이아웃, 인터랙션 로직 또는 애니메이션을 추가할 수 있다.

 

  1. Dependecies 추가
    : 우선  RecyclerView의 dependency를 build.gradle에 추가한다.
    dependencies {
        implementation 'androidx.recyclerview:recyclerview:1.2.1'
    }


  2. RecyclerView의 Layout 생성
    : 해당 activity layout XML 파일(예: activity_main.xml)에 RecyclerView를 추가한다.
    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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">
    
        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="0dp"
            android:layout_height="0dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>


  3. RecyclerView에 아이템에 대한 Layout 기입
    : RecyclerView 의 각 아이템을 위한 새로운 XML layout 파일(예: list_item.xml)을 생성한다. 이 layout은 어떻게 각 아이템이 보여질지 정의한다.
    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/textViewItem"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:textSize="18sp"
        android:textColor="@android:color/black"/>


  4. Adapter 클래스 생성
    : RecyclerView.Adapter를 확장한 새로운 Java 혹은 Kotlin 클래스 (MyAdapter)를 생성한다. 이 class는 목록에 있는 데이터 view를 생성하고 바인딩하는 것을 담당한다.
    class MyAdapter(private val itemList: List<String>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
    
        // ViewHolder class that holds the item layout
        class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
            val textView: TextView = itemView.findViewById(R.id.textViewItem)
        }
    
        // Inflates the item layout and creates the ViewHolder
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
            val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
            return MyViewHolder(view)
        }
    
        // Binds the data to the views in the ViewHolder
        override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
            holder.textView.text = itemList[position]
        }
    
        // Returns the total number of items
        override fun getItemCount(): Int {
            return itemList.size
        }
    }


  5. Activity 클래스에 RecyclerView 준비
    : Activity 클래스(예: MainActivity)에 RecyclerView를 준비하고, LayoutManager를 할당 후 샘플 데이터와 함께 Adapter를 설정한다.
    class MainActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // Reference to the RecyclerView
            val recyclerView = findViewById<RecyclerView>(R.id.recyclerView)
    
            // Sample data to display in the RecyclerView
            val items = listOf("Item 1", "Item 2", "Item 3", "Item 4", "Item 5")
    
            // Set LayoutManager for RecyclerView
            recyclerView.layoutManager = LinearLayoutManager(this)
    
            // Set Adapter for RecyclerView
            recyclerView.adapter = MyAdapter(items)
        }
    }


  6. 앱 실행
    : 앱을 실행하면, RecyclerView 를 활용한 텍스트 아이템을 가진 샘플 목록이 띄워진다.

* 설명

  1. Adapter (MyAdapter)
    1. 각 아이템 view에 데이터(itemList)를 바인딩한다.
    2. list의 각 아이템에 대한 아이템 layout(list_item.xml)을 인플레이션한다.
  2. ViewHolder (MyViewHolder)
    1. 이 경우 TextView와 같이 각 아이템 내부의 view에 대한 references를 보유한다.
    2. Adapter 내부에 생성되어 findViewById를 반복적으로 호출하지 않도록 한다.
  3. LayoutManager
    1. MainActivity에서 LinearLayoutManager를 사용해 항목을 세로 목록으로 정렬한다. Grid에는 GridLayoutManager를 사용하거나 사용자 정의 그리드를 만들 수 있다.