리사이클러뷰는 리스트뷰를 대체하는 요소이다 리스트뷰보다 커스텀할 범위가 커서 구글도 이젠 리스트뷰보단 리사이클러뷰를 개발에 사용할것을 권장하고있다
리사이클러뷰란?
페이스북이나 인스타그램처럼 동일한 형태의 뷰를 재활용하여 데이터에따라 다르게 출력할수있는 뷰
필요한 사전작업
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]
}
}
}
결과 화면
