버튼 수집상

[안드로이드] onBindViewHolder()가 호출될 때마다 뷰홀더 내부 가로 스크롤이 리셋되는 이슈 본문

TIL - 안드로이드

[안드로이드] onBindViewHolder()가 호출될 때마다 뷰홀더 내부 가로 스크롤이 리셋되는 이슈

cocokaribou 2023. 5. 17. 11:16

스크롤 이슈

기본적인 건데 까먹는 바람에

스크롤 리스너 달아서 오프셋 값 저장하기 등등 쌩 난리를 쳤었다..

다시 잊지 않도록 기록해둔다.

 

문제는 onBindViewHolder 가 호출되는 시점에 매번 RecylerView.Adapter를 세팅해주고 있었던 것.

adapter를 최초 한 번만 세팅하면

전체 세로 스크롤을 오르내리면서 onBindViewHolder()를 부르더라도 뷰홀더 안 쪽의 가로 스크롤 위치가 유지된다.

 

수정 전 (제대로 안 돌아감)

private val mAdapter = GoodsAdapter()

override fun onBind(data: Any?, position: Int) {
    initUI(data)
}

private fun initUI(data: ModuleData) = with(binding.rv) {
    scrollTo(data.savedX, 0)
    
    adapter = mAdapter
    layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)

    addOnScrollListener(object: RecyclerView.OnScrollListener() { 
        override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
            super.onScrolled(recyclerView, dx, dy)
            data.savedX = dx // 여기서 가로 스크롤 값 저장.. 인데 절대값이 안 들어온다
        }
    })
    
    mAdapter.submitList(data.goodsList)
    //...
}

수정 후

private val mAdapter = GoodsAdapter()

init {
    initRecyclerView()
}

private fun initRecyclerView() = with(binding.rv) {
    adapter = mAdapter
    layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
}

override fun onBind(data: Any?, position: Int) {
    initUI(data)
}

private fun initUI(data: ModuleData) {
    mAdapter.submitList(data.goodsList)
    //...
}
728x90