티스토리 뷰
ConcatAdapter
RecyclerView 1.2.0에서 새롭게 출시한 어댑터입니다. 이름에서 알 수 있듯 여러 어댑터를 연결하는 역할을 합니다. 기존 어댑터의 문제점은 하나의 어댑터에서 여러 ViewHolder를 관리할 때 객체 지향의 의미가 퇴색되고 코드가 쉽게 더러워졌습니다. ConcatAdapter를 통해 하나의 RecyclerView에서 여러 ViewHolder를 쉽게 관리할 수 있고, 기존 Adapter를 연결할 수 있습니다.
사용법
사용법은 매우 간단합니다. 생성자로 vararg 형태로 기존 Adapter를 넘겨주면, 순서대로 RecyclerView에 표시됩니다. 또한 데이터가 변경됐을 때 adapter의 notifyDataSetChanged(), ListAdapter라면 submitList를 호출하면 ConcatAdapter가 해당 부분을 자동으로 업데이트합니다.
ConcatAdapter(@NonNull vararg adapters: RecyclerView.Adapter<out RecyclerView.ViewHolder!>!)
class MainActivity : AppCompatActivity() {
private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(binding.root)
initRecyclerView()
}
private fun initRecyclerView() {
val config = ConcatAdapter.Config.Builder()
.setIsolateViewTypes(false)
.setStableIdMode(ConcatAdapter.Config.StableIdMode.SHARED_STABLE_IDS)
.build()
binding.adapter = ConcatAdapter(config, StringAdapter1(), StringAdapter2())
}
}
ViewHolder 공유
ConcatAdapter는 여러 Adapter를 이어줍니다. 기본적으로 Adapter마다 ViewHolder Pool을 따로 가지고 있으며, 서로 공유하지 않습니다. 하지만 여러 Adapter가 같은 ViewHolder를 사용하는 경우 공유하는 것이 자원적으로 이득입니다. ConcatAdapter.Config를 통해 설정할 수 있습니다. setIsolateviewTypes를 false로 하면 Adapter끼리 ViewHolder를 공유합니다. (기본값은 true)
val config = ConcatAdapter.Config.Builder()
.setIsolateViewTypes(false)
.build()
StableIds
경우에 따라 Adapter가 ListAdapter 기반이 아닌 StableId 기반일 수 있습니다. Adapter마다 StableId를 공유할지 독립적으로 사용할지 설정할 수 있습니다.
val config = ConcatAdapter.Config.Builder()
.setStableIdMode(ConcatAdapter.Config.StableIdMode.SHARED_STABLE_IDS)
.build()
- StableIdMode.NO_STABLE_IDS : ConcatAdapter가 StableId를 사용하지 않습니다.
- StableIdMode.ISOLATED_STABLE_IDS : Adapter마다 독립적인 StableId를 사용합니다. 다른 Adapter가 같은 Id를 사용해도 상관없습니다. 하지만 모든 Adapter가 StableId를 설정해야 합니다.
- StableIdMode.SHARED_STABLE_IDS : Adapter가 서로 StableId를 공유합니다.
ViewHolder Position
RecyclerView가 1.2.0으로 버전이 올라가면서 adapterPosition이 deprecated 되었으며 다른 방법으로 Position을 구해야 합니다.
- layoutPosition : 마지막으로 Layout에 전달된 Position입니다. 경우에 따라 Adapter의 Position과 다를 수 있습니다. RecyclerView는 성능을 위해 ViewHolder Pool를 만들어 공유하고 재사용합니다. 따라서 다른 ViewHolder가 배치되고 Pool에 들어가는 과정에서 업데이트 되지 않는 경우가 생길 수 있습니다.
- bindingAdapterPosition : ViewHolder가 Binding된 Adapter에서 실제 Position입니다. 사용자의 이벤트를 처리할 때 많은 상황에서 bindingAdapterPosition을 사용하면 됩니다.
- absoluteAdapterPosition : ViewHolder를 표시하는 RecyclerView의 Adapter에서 Position입니다. 경우에 따라 ViewHolder가 Bind된 Adapter와 RecyclerView가 실제로 사용하는 Adapter가 다를 수 있습니다.(ConcatAdapter를 사용할 경우)
'Android' 카테고리의 다른 글
| Android ConcatAdapter - 중복 LayoutManager (0) | 2022.04.06 |
|---|
- Total
- Today
- Yesterday
- gradle
- isActive
- TDD
- git
- ConcatAdapter
- viewmodel
- Flowable
- Flutter
- Exception
- commit
- ViewModelProvider
- 함수
- DSL
- observable
- ViewModelStoreOwner
- CancellationException
- clean code
- rxjava
- DART
- 클린코드
- Android
- 연산자
- Coroutine
- 보이스카우트 규칙
- ConcatAdapter.Config
- Kotlin
- null
- 코루틴
- 클린 코드
- Widget
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
