일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- DevelopmentRegion
- url 추적
- convert base64
- development language
- UIViewControllerTransitioningDelegate
- scrolling tab
- 기존 앱
- pod install
- List
- oberve url
- ios
- swift #swift keychain #keychain 사용법
- Side Menu
- Swift Package Manager
- 상단 탭바
- transformation.map
- swift
- notifychanged
- 스크롤 탭
- Tuist
- SwiftUI
- GeometryReader
- UIPresentationController
- Android
- 개발자 면접
- ViewBuilder
- DataBinding
- detect url
- base64 변환
- url 관찰
- Today
- Total
버그 잡이
[코틀린] Kotlin RecyclerView 각 요소 살펴보기 본문
지금까지는 안드로이드를 공부할때 기능구현에만 중점을 두었다.
이제부터는 각 기능의 요소를 한줄한줄 파헤치며 공부해보고자 한다.
(recyclerView 튜토리얼이 아니라 recyclerView 자체에 대한 이해를 높이고자 정리하는 글입니다.)
0. 구성요소
ViewHolder
- 개별 아이템의 View를 생성하여 제공한다.
Adapter
- 데이터를 관리하고 목록에 표시한다.
Activity
- UI로 recyclerView를 보여주는 클래스이다.
1. ViewHolder & Adapter
class MyAdapter(private val myDataset: Array<String>) :
RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
//개별 아이템에 view 생성하여 제공
class MyViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)
//실제로 표현될 item view 생성
override fun onCreateViewHolder(parent: ViewGroup,
viewType: Int): MyAdapter.MyViewHolder {
// 내가 표현하고 싶은(코드로 조작하고 싶은) 레이아웃을 inflate하고
val textView = LayoutInflater.from(parent.context)
.inflate(R.layout.my_text_view, parent, false) as TextView
//ViewHolder에 담아서 반환한다.
return MyViewHolder(textView)
}
//item에 데이터를 바인딩한다. 화면에 들어온 아이템에 대해서만 작업을 진행
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.textView.text = myDataset[position]
}
// item의 갯수를 반환한다.
override fun getItemCount() = myDataset.size
}
* 요약
1) ViewHolder라는 객체를 통해서 각 항목을 나타낸다.
2) ViewHolder 위에 inflate를 통해서 내가 원하는 레이아웃을 표현하고 객체를 반환한다(onCreateViewHolder)
* 화면에 표시될 갯수+알파 만큼만 생성된다.
3) 거기에 데이터를 넣어준다(onBindViewHolder)
"왜 뷰홀더를 사용하는가?"
- 이를 알기 위해선 기존 listView를 사용하던 시점으로 거슬러 올라가야 한다.
- 당시에는 ViewHolder라는 개념이 없었고 그냥 뷰를 inflate해서 사용했다. 이 경우 문제가 있었는데 "레이아웃의 각 요소를 가져오려면 일일히 findViewById를 해줘야했다."
- view의 세부정보를 담고 있는 Viewholder라는 개념을 도입해서 매번 findviewbyid를 해주지 않아도 세부 view를 가져올 수 있게 하였다.
*참조 : http://dudmy.net/android/2017/06/23/consider-of-recyclerview/
"최근 심화된 뷰홀더"
class ItemViewHolder(override val containerView: View)
: RecyclerView.ViewHolder(containerView), LayoutContainer
1. 최근 코틀린 ViewHolder에서는 LayoutContainer를 상속받아 사용합니다.
- 이를 활용하면 컴파일시 내부적으로 view의 내용을 캐시하는 코드를 생성하여 좀 더 빠른 화면출력이 가능하다고 합니다.
https://proandroiddev.com/kotlin-android-extensions-using-view-binding-the-right-way-707cd0c9e648
2. 그리고 코틀린에서는 ViewHolder를 adapter에서 따로 분리해 클래스를 만들어 사용합니다.
- 코틀린에서는 이렇게 분리해도 다른 adapter에서 호환이 되기 때문에 이렇게 하나 만들어 놓고 다른 adapter에서 가져다 사용할 수 있습니다.
2. Activity
class MyActivity : Activity() {
private lateinit var recyclerView: RecyclerView
private lateinit var viewAdapter: RecyclerView.Adapter<*>
private lateinit var viewManager: RecyclerView.LayoutManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.my_activity)
viewManager = LinearLayoutManager(this)
viewAdapter = MyAdapter(myDataset)
recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view).apply {
setHasFixedSize(true) //리사이클러뷰 크기 고정.
//이유는 itemdl 추가,삭제시 recyclerView 크기가 계속 변경된다면 다른 view들에 영향을 미칠수 있다.
layoutManager = viewManager //레이아웃 매니저 셋팅
adapter = viewAdapter //아답터 셋팅
}
}
// ...
}
* Activity는 레이아웃 매니저와 어댑터를 생성하고 연결해주는 곳이다.
*참고자료(유튜브 코딩메이트 디모)
https://www.youtube.com/watch?v=lJGmRodM1vk&list=PLQdnHjXZyYafR57vhXjmw2h3YEl0dM0zC&index=13
'안드로이드 > 코틀린' 카테고리의 다른 글
[Kotlin] Generic 제네릭 #base 클래스 generic 코드 해석하기 (0) | 2020.06.15 |
---|---|
[코틀린] kotlin 커스텀뷰(customView) 만들기 (0) | 2020.04.06 |
[코틀린]Kotlin floating button 클릭시 로딩 회전 #extend floating button #loading (0) | 2020.03.27 |
[코틀린]kotlin Arraylist to Array 변환 (0) | 2020.03.26 |
android kotlin extended floatingButton(코틀린 플로팅 버튼) (0) | 2020.03.14 |