[Android]/[Kotlin]

[공부] 코틀린 RecyclerView 예제

Hevton 2023. 1. 13. 14:30
반응형

 

자바에서는 리사이클러뷰를 많이 다뤄봤지만

코틀린으로는 많이 다뤄보지 못했다.

사실 똑같다.

 

정리할 겸 예제를 작성한다. 강의는 아니므로

처음보는 분들에게 학습에는 어려움이 있을 수 있다!

 

 


 

 

 

아이템을 담을 뷰를 정의한다.

 

item_recycler.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center_vertical">


    <TextView
        android:id="@+id/textNo"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:text="01"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/textTitle"
        android:layout_width="0dp"
        android:layout_weight="5"
        android:text="Title"
        android:layout_height="wrap_content"/>

    <TextView
        android:id="@+id/textDate"
        android:layout_width="0dp"
        android:layout_weight="3"
        android:text="2021-01-01"
        android:layout_height="wrap_content"/>


</LinearLayout>

 

 

리사이클러뷰를 담을 레이아웃 정의

 

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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

데이터를 다룰 클래스, 데이터클래스를 정의한다.

 

Memo.kt

package made.by.hevton.kotlin_example

data class Memo(var no: Int, var title: String, var timestamp: Long) {}

 

 

데이터원본과 리사이클러뷰를, 포맷에 맞게 연결해줄 어댑터를 만든다.

 

CustomAdapter.kt

package made.by.hevton.kotlin_example

import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import made.by.hevton.kotlin_example.databinding.ItemRecyclerBinding
import java.text.SimpleDateFormat

class CustomAdapter: RecyclerView.Adapter<Holder>() {

    var listData = mutableListOf<Memo>()

    override fun getItemCount(): Int {
        return listData.size
    }

    // Holder를 만들어서 리턴
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {

        // 액티비티에서 사용과 다르게, 어댑터에서 사용하는 바인딩의 inflate는 3개의 파라미터를 이용한다
        // inflater, 부모뷰, 자동 attach 여부 (https://whyprogrammer.tistory.com/624)
        val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)

        return Holder(binding)

    }

    // Holder와 데이터 연결
    override fun onBindViewHolder(holder: Holder, position: Int) {

        val memo = listData.get(position)
        holder.setMemo(memo)
    }

}

class Holder(val binding: ItemRecyclerBinding): RecyclerView.ViewHolder(binding.root) {

    // 클릭 시 이벤트 처리
    init {
        binding.root.setOnClickListener {
            Toast.makeText(binding.root.context, "item = ${binding.textTitle.text}", Toast.LENGTH_SHORT).show()
        }
    }

    fun setMemo(memo: Memo) {

        binding.textNo.text = "${memo.no}"
        binding.textTitle.text = memo.title

        var sdf = SimpleDateFormat("yyyy/MM/dd")
        var formattedDate = sdf.format(memo.timestamp)

        binding.textDate.text = formattedDate
    }

}

 

 

구현

 

MainActivity.kt

package made.by.hevton.kotlin_example

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.LinearLayout
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.coroutines.*
import made.by.hevton.kotlin_example.databinding.ActivityMainBinding
import kotlin.system.measureTimeMillis

class MainActivity : AppCompatActivity() {

    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        // 데이터 생성
        val data: MutableList<Memo> = loadData()

        var adapter = CustomAdapter()
        adapter.listData = data

        // adapter 연결
        binding.recycler.adapter = adapter

        // 형태를 결정하는 레이아웃 매니저
        binding.recycler.layoutManager = LinearLayoutManager(this)




    }

    fun loadData(): MutableList<Memo> {

        val data: MutableList<Memo> = mutableListOf()

        for(no in 1..100) {

            val title = "제목 ${no}"
            val date = System.currentTimeMillis()

            var memo = Memo(no, title, date)
            data.add(memo)
        }

        return data
    }
}

레이아웃 매니저의 종류

  • LinearLayoutManager
    - 세로 : LinearLayoutManager(this)
    - 가로 : LinearLayuotManager(this, LinearLayoutManager.HORIZONTAL, false)

  • GridLayoutManager
    - GridLayoutManager(this, 열 갯수)
  • StaggeredGridLayoutManager
    - 세로 : StaggeredGridLayoutManager(열 갯수, StaggeredGridLayoutManager.VERTICAL)
    - 가로 : StaggeredGridLayoutManager(열 갯수, StaggeredGridLayoutManager.HORIZONTAL)

 

끝!

반응형