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