본문 바로가기

안드로이드

Android RecyclerView 갱신이 안되는 원인 정리

안드로이드 앱 개발 중 에러가 발생하는 경우는 정말 감사하다. 바로 어디가 문제인지 볼 수도, 찾아볼 수도 있기 때문이다. 하지만 뷰 구성을 할 때 에러가 안나는 경우가 많으며, 찾기도 힘들다. 이럴 때는 경험상 정상적인 사용을 하였는가를 짚어봐야 한다. 그 중 최근에 헤맸던 부분을 공유하고자 한다.

RecyclerView는 기본적으로 ViewHolder 패턴을 지원하기에 Adapter에 onBindViewHolder() 메서드를 제공하며 override로 구현해야 한다. 해당 onBindViewHolder()가 호출되지 않는 경우였는데 아래의 경우가 있다.

 

1. RecyclerView.Adapter.getItemCount()의 return 값이 0일 경우

 

2. LayoutManager 를 적용하지 않았을 경우

RecyclerView는 안드로이드에서 리스트를 활용하려 한다면 사용하는데 리스트의 아이템 관리를 LayoutManager에서 담당한다. LayoutManager를 해당 뷰에 설정해주지 않는다면, 아무리 리스트의 아이템을 바꾸거나 추가해도 변하지 않는다.

 

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.LayoutManager

 

RecyclerView.LayoutManager  |  Android 개발자  |  Android Developers

RecyclerView.LayoutManager This package is part of the Android support library which is no longer maintained. The support library has been superseded by AndroidX which is part of Jetpack. We recommend using the AndroidX libraries in all new projects. You s

developer.android.com

 

적용할 수 있는 LayoutManager

LinearLayoutManager : 목록 형태의 구성

https://developer.android.com/reference/android/support/v7/widget/LinearLayoutManager

 

LinearLayoutManager  |  Android 개발자  |  Android Developers

From class android.support.v7.widget.RecyclerView.LayoutManager

developer.android.com

GridLayoutManager : 격자 형태의 구성, 모든 격자의 크기가 동일하다.

https://developer.android.com/reference/android/support/v7/widget/GridLayoutManager

 

GridLayoutManager  |  Android 개발자  |  Android Developers

From class android.support.v7.widget.LinearLayoutManager From class android.support.v7.widget.RecyclerView.LayoutManager

developer.android.com

StaggeredGridLayoutManager : 격자 형태의 구성 : 격자마다 크기가 다르며, 배치 순서나 아이템의 배치를 변경할 수 있다.

https://developer.android.com/reference/android/support/v7/widget/StaggeredGridLayoutManager

 

StaggeredGridLayoutManager  |  Android 개발자  |  Android Developers

From class android.support.v7.widget.RecyclerView.LayoutManager

developer.android.com

RecyclerView에 적용하는 방법은 코드에서도, xml에서도 가능하다. 물론 좀더 custom하게 적용하려면 코드가 추가되어야 하지만 간단한 리스트의 경우 xml에 명시만 해주면 된다.

 

1) layout.xml에 적용

...
<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/rv_search_results"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:translationZ="2dp"
    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" />
...

 

2) 코드에서 적용

...
recyclerView.run{
	layoutManager = LinearLayoutManager(context)
	adapter = MyAdapter().apply {
    	//Add Adapter Controll
    }
}
...