반응형
더보기
이글은 냉동코더님의 유투브 내용을 보며 혼자 학습한 내용을 포스터 한것입니다.
RecyclerView
1. 정의 및 특징
RecyclerView는 이미지나 텍스트를 리스트화해서 볼 수 있게 해주는 컨테이너로써 ListView의 확장판 개념이다.
기존 ListView보다 향상된 성능을 제공하는데 어떤식으로 성능이 향상된것인지 알아보자.
오른쪽에 보여지는 이미지가 RecyclerView의 모습인데 리스트뷰는 전체 데이터의 수 만큼 ViewHolder를 만들어야하지만 recyclerView는 이전에 사용했던 ViewHolder를 재사용함으로써 전체 데이터의 수 만큼 ViewHolder를 만들필요 없기 때문에 자원을 세이브할 수 있다는 점에서 기존 ListView보다 향상된 성능을 발휘한다.
RecyclerView를 사용하기 위해서는 Adapter가 필요하다.
여기서 Adapter는 MainActivity에서 데이터를 받아오고 RecyclerView.Adapter를 상속해주어야 한다.
RecyclerView Adapter를 만들때 기본으로 만들어야하는 함수는 3가지이다.
1. onCreateViewHolder
viewholder를 처음 만들때 어떤 XML파일을 이용하여 만들것인지 결정,
2. onBindViewHolder
이렇게 만들어진 viewholder에다가 어떤 데이터를 바인딩할지 결정.
3. getItemCount
viewholder의 전체 개수를 알려줌.
2. RecyclerView 구현
라이브러리 추가
dependencies {
implementation 'androidx.recyclerview:recyclerview:1.2.1'
}
화면 구성
activitiy_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_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat 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/main_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="MainText"
android:textSize="30sp"
android:textStyle="bold"
/>
<TextView
android:id="@+id/sub_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SubText"
android:textSize="18sp"
/>
</androidx.appcompat.widget.LinearLayoutCompat>
Adapter생성
RecyclerViewAdapter.kt
package com.example.recyclerviewex
import android.service.autofill.Dataset
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.lifecycle.LiveData
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.list_item.view.*
class RecyclerViewAdapter(private val dataset: ArrayList<List<String>>) : RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>() {
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int
): RecyclerViewAdapter.ViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false)
return ViewHolder(view)
} //뷰홀더를 만든다
override fun onBindViewHolder(holder: RecyclerViewAdapter.ViewHolder, position: Int) {
holder.bind(dataset[position])
} //뷰홀더에 데이터를 넣는다
override fun getItemCount(): Int {
return dataset.size
} //뷰홀더 개수를 알려준다.
class ViewHolder(view: View): RecyclerView.ViewHolder(view){
private val tvMain:TextView = view.main_text
private val tvSub:TextView = view.sub_text
fun bind(data: List<String>){
tvMain.text = data[0]
tvSub.text = data[1]
}
}
}
데이터 생성 및 RecylcervView와 Adapter연결
MainActivity.kt
package com.example.recyclerviewex
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private val dataset: ArrayList<List<String>> = arrayListOf()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
add()
recycler_view.layoutManager = LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)
recycler_view.adapter = RecyclerViewAdapter(dataset)
}
private fun add(){
for(i in 0..99){
dataset.add(listOf("$i th main", "$i th sub"))
}
}
}
반응형
'안드로이드(Kotlin)' 카테고리의 다른 글
Kotlin 코틀린의 object와 class 키워드 (0) | 2022.08.30 |
---|---|
Kotlin 코틀린의 Retrofit (0) | 2022.08.26 |
Kotlin 코틀린의 SharedPreferences (0) | 2022.08.08 |
Kotlin 코틀린의 Context (0) | 2022.08.08 |
Kotlin 코틀린의 Handler 와 Looper (0) | 2022.08.04 |