상세 컨텐츠

본문 제목

(RecyclerView) 스크롤시 특정 item 꼬임 현상 (adapter position)

개발하고/안드

by 싸만다_ 2023. 4. 22. 13:01

본문

 

 

 

 

 

 

 

 

 

 

 

이렇게 저렇게 RecyclerView 를 만지다가

data binding item 표현을 좀 더 깔끔하게 표현해보려고 자꾸 손대다가 문제 발생.

 

 

 

 

 


문제 현상
- RecyclerView scoll시 특정 item이 foreground 상황에서 계속 변경됨

 

RecyclerView 재사용 position 문제

 

디버깅 해보니 문제되는 item의 adapter position이 말도 안되는 값으로 계속 설정 된다.

그렇다고 재사용을 막아버릴 순 없고.

삽질에 삽질을 거듭하다보니

원인은 각 아이템에 대해 정의한 data binding의 scope 때문에 발생한 거였다.

 

 


 

 

 

문제 코드

    private lateinit var binding: ListItemBinding

    class CoffeeViewHolder(binding: ListItemBinding) : ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CoffeeViewHolder {
        binding = ListItemBinding.inflate(LayoutInflater.from(parent.context), parent,false)
        return CoffeeViewHolder(binding)
    }

    override fun onBindViewHolder(holder: CoffeeViewHolder, position: Int) {
        binding.run...
        .....

 

 

 

정상 동작 코드

    class CoffeeViewHolder(itemView: View) : ViewHolder(itemView) {
        val binding = DataBindingUtil.bind<ListItemBinding>(itemView)
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CoffeeViewHolder =
        CoffeeViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.list_item, parent, false))

    override fun onBindViewHolder(holder: CoffeeViewHolder, position: Int) {
        holder.binding?.let {
        ...

 

 

 

 

data binding 쓰면서 늘 그냥 위(해결코드)처럼 썼는데

layout xml 파일명을 굳이 쓰고 싶지 않아서 스타일만 바꿔보리라 생각한 것이었는데

이렇게 될 줄이야...

 

결국 RecyclerView 재사용은 현재 화면에 얼마나 보이는지,

재사용 가능한 아이템의 position 이 어딘지 알기 위해 실제 load된 view와 전체 화면 크기를 계산하는 것일텐데

이 지점에서 전역변수로 사용하게 된 것이 방해가 되었던 것이리라.

자세한 code digging은 TBD (ㅋㅋ)

 

 

 

 

??? : RecyclerView 언제 좀 정복할 수 있니...?

관련글 더보기

댓글 영역