이름에서 알 수 있듯이 RecyclerView는 이러한 개별 요소를 재활용합니다. 항목이 스크롤되어 화면에서 벗어나더라도 RecyclerView는 뷰를 제거하지 않습니다. 대신 RecyclerView는 화면에서 스크롤된 새 항목의 뷰를 재사용합니다.
위의 소개한 글은 Google Android 개발자 문서의 RecyclerView 내용입니다.
자 이제 간단하게 RecyclerView에 대해서 설명드리겠습니다.
RecyclerView
RecyclerView를 구성하기 위해 필요한 준비물은
다음과 같습니다.
1. AdpaterClass
2. ItemView (xml)
3. LayoutManager & RecyclerView
AdapterClass
class RecyclerViewAdapter(
private val list: MutableList<String>
): RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder>() {
private var itemLists: MutableList<String> = list
inner class RecyclerViewHolder(
private val itemView: View
) : RecyclerView.ViewHolder(itemView) {
private val binding: ItemRecyclerviewBinding? = DataBindingUtil.bind(itemView)
fun bind(position: Int) {
binding?.let {
it.tvItem.text = itemLists[position]
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
val view: View = LayoutInflater.from(parent.context)
.inflate(R.layout.item_recyclerview, parent, false)
return RecyclerViewHolder(view)
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
holder.bind(position)
}
override fun getItemCount(): Int = itemLists.size
@SuppressLint("NotifyDataSetChanged")
fun changeItemLists(list: MutableList<String>) {
itemLists.clear()
itemLists.addAll(list)
notifyDataSetChanged()
}
}
onCreateViewHolder() : RecyclerView는 ViewHolder를 새로 만들어야 할 때마다 이 메서드를 호출합니다. 이 메서드는 ViewHolder와 그에 연결된 View를 생성하고 초기화하지만 뷰의 콘텐츠를 채우지는 않습니다.
onBindViewHolder() : RecyclerView는 ViewHolder를 데이터와 연결할 때 이 메서드를 호출합니다. 이 메서드는 적절한 데이터를 가져와서 그 데이터를 사용하여 뷰 홀더의 레이아웃을 채웁니다.
getItemCount() : RecyclerView는 데이터 세트 크기를 가져올 때 이 메서드를 호출합니다.
ItemView (item_recyclerview.xml)
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25dp"/>
</LinearLayout>
</layout>
LayoutManager & RecyclerView
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var rvAdapter: RecyclerViewAdapter
private val list: MutableList<String> by lazy {
mutableListOf(
"one",
"two",
"three",
"four",
"five",
"six",
"seven",
"eight",
"nine",
"ten"
)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil
.setContentView(this, R.layout.activity_main)
rvAdapter = RecyclerViewAdapter(list)
binding.rvEx.adapter = rvAdapter
}
}
activity_main.xml
<layout>
<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/rv_ex"
android:layout_width="0dp"
android:layout_height="150dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>
<Button
android:id="@+id/btn_refresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
위와 같이 RecyclerView layoutManager 속성 값을 추가해줘야 합니다.
여기까지 저의 긴 글을 읽어주셔서 감사합니다.
제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 하겠습니다.
'Android > 스터디 노트' 카테고리의 다른 글
[Android] RecyclerView Drag&Drop/Swipe 기능 구현(ItemTouchHelper) 드래그 앤 드롭 (1) | 2022.08.21 |
---|---|
[Android] RecyclerView 깜빡이는 현상 해결 (notifyDataSetChanged) (0) | 2022.08.17 |
[Google Play Store] 구글 테스트 계정의 모든것, 구글심사 테스트 계정, 인앱결제 테스트 계정 (4) | 2022.07.25 |
[Android] SHA-1 key 확인 (AndroidStudio - Bumblebee ver.) (0) | 2022.05.11 |
[Android] Android12 Splash Screen (안드로이드12 스플래시) (0) | 2022.04.30 |
최근댓글