간단한 RecyclerView예제

수뱀 ㅣ 2024. 10. 28. 00:22

리사이클러뷰는 리스트뷰를 대체하는 요소이다 리스트뷰보다 커스텀할 범위가 커서 구글도 이젠 리스트뷰보단 리사이클러뷰를 개발에 사용할것을 권장하고있다

 

리사이클러뷰란?

페이스북이나 인스타그램처럼  동일한 형태의 뷰를 재활용하여 데이터에따라 다르게 출력할수있는 뷰

 

필요한 사전작업

1. 뷰바인딩 활성화

2. 리사이클러뷰에 들어가는 재활용가능한뷰

 

1. 뷰바인딩 활성화

build.gradle.kts(module:app)

android{
...
viewBinding {
        enable = true
    }
}

 

2. 리사이클러뷰에 들어가는 재활용가능한뷰

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textViewHello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextViewHello" />

    <TextView
        android:id="@+id/textViewCountry"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="textViewCountry" />
</LinearLayout>

 

3. activity_main

activity_main.xml

<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

 

4. MainActivity.kt

import android.os.Bundle
import android.view.ViewGroup
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.lion.recyclerviewex1028.databinding.ActivityMainBinding
import com.lion.recyclerviewex1028.databinding.RowBinding

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding

    //리사이클러뷰에들어갈 텍스트1
    val strHello = listOf(
        "안녕하세요", "Hello", "你好", "こんにちは", "привет", "Salut", "Hola", "CIAO", "oi"
    )

    //리사이클러뷰에들어갈 텍스트2
    val strCountry = listOf(
        "한국어", "영어", "중국어", "일본어", "러시아어", "프랑스어", "스페인어", "이탈리아어", "포르투갈어"
    )

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
            val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
            insets
        }

        activityMainBinding.apply {
            // RecyclerView에 어뎁터를 설정한다.
            RecyclerView.adapter = RecyclerViewAdapter()
            // 항목들을 어떻게 보여줄 것인지를 설정한다.
            // 한줄에 하나씩 배치한다
            RecyclerView.layoutManager = LinearLayoutManager(this@MainActivity)

            // 각 항목을 구분하기 위한 구분선
            //뷰 사이에 줄을 그어 나눔
            val deco = DividerItemDecoration(this@MainActivity, DividerItemDecoration.VERTICAL)
            RecyclerView.addItemDecoration(deco)
        }
    }

    // ViewHolderClass
    // 항목 하나를 구성하기 위해 사용하는 View 객체를 보관하는 역할을 수행한다
    // 생성자로 ViewBinding객체를 받는다.
    // 부모의 생성자로 보여질 View 를 전달을 한다.
    // 부모의 생성자로 전달한 View가 RecyclerView의 항목 하나로 쓰여진다
    inner class ViewHolderClass(var rowBinding: RowBinding) :
        RecyclerView.ViewHolder(rowBinding.root)

    // RecyclerViewAdapter
    inner class RecyclerViewAdapter : RecyclerView.Adapter<ViewHolderClass>() {

        // ViewHolder 객체를 생성해 반환해주는 메서드
        // 항목을 구성하려고 할 때 재사용 가능한 ViewHolder가 없을 경우 이 메서드를 호출한다
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolderClass {
            // ViewBinding 객체를 생성한다.
            val rowBinding = RowBinding.inflate(layoutInflater)
            // ViewHolder 객체를 생성한다.
            val viewHolder = ViewHolderClass(rowBinding)
            return viewHolder
        }

        //뷰의개수를 반환한다
        override fun getItemCount(): Int {
            return strHello.size
        }

        // 항목 하나에 있는 View에 값을 넣어주는 작업을 한다.
        // holder : 현재 항목에 해당하는 ViewHolder 객체
        // position : 지금 구성하고자 하는 항목의 순서값
        // position 번째 항목 하나의 View에 값을 설정하는 작업을 한다
        override fun onBindViewHolder(holder: ViewHolderClass, position: Int) {
            holder.rowBinding.textViewHello.text = strHello[position]
            holder.rowBinding.textViewCountry.text = strCountry[position]
        }

    }

}

 

 

결과 화면