개발여행일지~
RecyclerView 공부하기!! 본문
RecyclerView는 무엇일까?
- RecyclerView는 한정적인 화면에 많은 데이터를 넣을 수 있는 View입니다.
- Recycle을 한국어로 하면 재활용하다라는 뜻입니다.
- 즉, View를 재활용해서 사용하겠다는 말입니다.
ListView 와 RecyclerView 차이점!
ListView
- 사용자가 스크롤 할 때마다 위에 있던 아이템은 삭제되고, 맨 아래의 아이템은 생성 되길 반복합니다
- 아이템이 100개면 100이 삭제 생성됩니다. 즉 계속 삭제와 생성을 반복하므로 성능에 좋지않습니다.
RecyclerView
- 사용자가 스크롤 할 때, 위에 있던 아이템은 재활용 돼서 아래로 이동하여 재사용 합니다.
- 즉 아이템이 100개여도 10개정도의 View만 만들고 10개를 재활용해서 사용합니다.
- View를 계속 만드는 ListView의 단점을 보완하기 위해 나왔습니다.
RecyclerView 사용하기위한
1) Adapter
- Adapter란 데이터 테이블을 목록 형태로 보여주기 위해 사용되는 것으로, 데이터를 다양한 형식의 리스트 형식을 보여주기 위해서 데이터와 RecyclerView 사이에 존재하는 객체이다.
- 즉 데이터와 RecyclerView 사이의 통신을 위한 연결체이다.
2) ViewHolder
- ViewHolder란 화면에 표시될 데이터나 아이템들을 저장하는 역할 입니다.
- RecyclerView의 개념을 적용하기위해선 스크롤 해서 위로 올라간 View를 재활용하기 위해서 이 View를 기억하고 있어야 합니다. ViewHolder가 그역할을 합니다.
RecyclerView예제
1) MainActivity
package com.example.listapp
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.listapp.MultiData.Companion.TYPE_CONTACT
import com.example.listapp.MultiData.Companion.TYPE_FAVORITE
import com.example.listapp.databinding.ActivityMainBinding
import telAdapter
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val dataList = arrayListOf<MultiData>()
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12345678", MultiData.TYPE_FAVORITE))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12151555", MultiData.TYPE_FAVORITE))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12155155", MultiData.TYPE_CONTACT))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12515155",MultiData.TYPE_CONTACT))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12341551",MultiData.TYPE_CONTACT))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12345676",MultiData.TYPE_CONTACT))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12345677",MultiData.TYPE_CONTACT))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12145888",MultiData.TYPE_CONTACT))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-12185181",MultiData.TYPE_CONTACT))
dataList.add(MultiData(R.drawable.user,"홍길동", "010-11111111",MultiData.TYPE_CONTACT))
binding.recyclerView.adapter = telAdapter(dataList)
val adapter = telAdapter(dataList)
binding.recyclerView.adapter = adapter
binding.recyclerView.layoutManager = LinearLayoutManager(this)
}
}
2) MyAdapter.kt
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.example.listapp.MultiData
import com.example.listapp.databinding.ItemContactBinding
import com.example.listapp.databinding.ItemFavoriteBinding
class telAdapter(private val itemList: ArrayList<MultiData>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
companion object {
const val VIEW_TYPE_FAVORITE = 1
const val VIEW_TYPE_CONTACT = 2
}
override fun getItemCount(): Int {
return itemList.size
}
override fun getItemViewType(position: Int): Int {
return if (itemList[position].type == MultiData.TYPE_FAVORITE) {
VIEW_TYPE_FAVORITE
} else {
VIEW_TYPE_CONTACT
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
return if (viewType == VIEW_TYPE_FAVORITE) {
val binding = ItemFavoriteBinding.inflate(inflater, parent, false)
FavoriteHolder(binding)
} else {
val binding = ItemContactBinding.inflate(inflater, parent, false)
ContactHolder(binding)
}
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
val item = itemList[position]
if (holder is FavoriteHolder) {
holder.bind(item)
} else if (holder is ContactHolder) {
holder.bind(item)
}
}
inner class FavoriteHolder(private val binding: ItemFavoriteBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: MultiData) {
binding.fvIcon.setImageResource(item.aIcon)
binding.fvUserid.text = item.aName
binding.fvTxtUsername.text = item.aTel
}
}
inner class ContactHolder(private val binding: ItemContactBinding) :
RecyclerView.ViewHolder(binding.root) {
fun bind(item: MultiData) {
binding.imgUserIcon.setImageResource(item.aIcon)
binding.txtUserId.text = item.aName
binding.txtUserName.text = item.aTel
}
}
}
3) activity_main
<?xml version="1.0" encoding="utf-8"?>
<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/favorite"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="즐겨찾기" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
실행결과
'코틀린 공부정리' 카테고리의 다른 글
지연 초기화를 알아보자! (0) | 2023.09.14 |
---|---|
Binding하면서 알게된 것 (0) | 2023.09.01 |
뷰 바인딩 (View Bindiing) (0) | 2023.08.22 |
회원가입시 조건과 비밀번호 입력시 제한사항 적용하기 (0) | 2023.08.17 |
간단하게 만든 로그인& 회원가입 어플 (0) | 2023.08.11 |