[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)
끝!
반응형