티스토리 뷰

Android

Android RecyclerView - ConcatAdapter

강태종 2022. 4. 1. 21:45

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
링크
«   2026/02   »
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
글 보관함