개발자 블로그

RecyclerView Adapter getItemCount() does not call 본문

프로그래밍/안드로이드

RecyclerView Adapter getItemCount() does not call

로이드.Roid 2022. 1. 16. 23:26

뭐 대부분의 문제가 그렇겠지만, 이 문제 역시 바보 같은 나의 실수 때문에 발생한 문제였다.

RecyclerView.Adapter의 getItemCount() 함수만 호출 안되는 것이 아니고, 다른 override 함수들인 onCreateViewHolder(), onBindViewHolder() 함수 역시 모두 호출이 되지 않았다. 브레이크 포인트를 걸어보고, 로그를 찍어봤지만 역시 호출이 안된다는 것이 확인됐다.

구글링을 해보면 LayoutManager 설정을 빼먹은게 아니냐는 글이 많고, 실제로 가끔 겪는 실수이긴한데, 이번에는 그 문제가 아니었다. 그리고 LayoutManager 설정을 빼먹었을 때는 Logcat 메시지에 아래 이미지처럼 친절하게 알려준다.

이번에 getItemCount()를 비롯해서 나머지 override 함수들이 호출되지 않은 이유는 deprecated 된 'kotlin-android-extensions' 플러그인을 제거하고 data binding으로 마이그레이션 하는과정에서 코딩 실수로 인해서 발생한 문제였다.

기존의 fragment 코드는 대략 아래와 같았다. 

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    val view = inflater.inflate(R.layout.fragment_shared_diary, container, false)

    // 필요한 초기화 처리들..

    return view
}

그리고 data binding으로 마이그레이션 하면서 수정 된 코드는 아래와 같았다.

private lateinit var binding: FragmentFooBarBinding

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = FragmentFooBarBinding.inflate(inflater, container, false)

    // 필요한 초기화 처리들..

    return view    // <- error!
}

아마 뭐가 문제인지 쉽게 찾았을거라고 생각한다. 초기화 코드들을 제거하니깐 쉽게 눈에 보이는데, 전체 코드를 봤을 때는 쉽게 찾기 힘든 문제였다. 그리고 아래 코드에서 view는 내가 선언한 변수가 아니지만 Fragment class에 있는 멤버이기 때문에 컴파일 타임에 에러로 잡히지도 않는다. sonarLint를 사용하고 있는데, 역시 마찬가지로 이 문제는 탐지하지 못하더라. onCreateView 함수의 리턴 타입도 nullable이기 때문에, null 값인 view를 리턴하더라도 아무런 문제가 없다. 대신에 화면이 레이아웃 되지 않게 된다. 이런 이유로 인해서 RecyclerView.Adapter의 override 함수들이 호출 되지 않았던거다.

그래서 올바른 코드는 아래와 같다.

private lateinit var binding: FragmentSharedDiaryBinding

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    binding = FragmentSharedDiaryBinding.inflate(inflater, container, false)

    // 필요한 초기화 처리들..

    return binding.root    // <- 수정
}

어이없을 정도의 실수 때문에 하루를 날렸네. 혹시나 비슷한 실수를 하는 사람이 있을까 싶어서 기록으로 남겨둔다. 누군가에게 도움이 되길..

Comments