[안드로이드] - RecyclerView(AdapterDataObserver)

hee09·2022년 3월 3일
0
post-thumbnail

개요

RecyclerView를 사용하다보면 데이터가 없는 경우가 있습니다. 이런 경우 개발자가 원한다면 RecyclerView에서 다른 화면을 띄워 데이터가 없는 상황을 표현할 수 있습니다. 데이터가 없는 상황을 보여주는 여러가지 방법이 있지만, 이 글에서는 AdapterDataObserver를 사용해서 상황에 맞는 View를 분기하여 보여주는 방법을 작성해보겠습니다.

AdapterDataObserver

안드로이드 Developer 홈페이지에 나와있는 AdapterDataObserver의 정의를 보면 RecyclerView.Adapter의 변화를 관찰하는 Observer 클래스라고 나와 있습니다. 즉, Adapter의 데이터가 새로 추가되거나 제거되는 등의 변화를 감지할 수 있는 클래스입니다. AdapterDataObserver 클래스는 추상 클래스이므로 상속받아 필요한 메소드만 구현해주면 됩니다.

여러가지 메소드가 존재하지만 가장 중요한 메소드는 onChanged() 메소드입니다. onChanged() 메소드는 데이터가 변경되면 호출되는 메소드입니다. 이 메소드 안에서 데이터가 있는 상황에서는 정상적으로 RecyclerView를 보여주고 데이터가 없는 상황에서는 대체로 보여줄 뷰나 레이아웃을 설정해주면 됩니다.

마지막으로는 원하는 메소드를 구현한 클래스를 Adapter의 registerAdapterDataObserver 메소드를 통해 등록해주면 됩니다.

간단한 예제 코드

AdapterDataObserver

class EmptyDataObserver(rv: RecyclerView?, tv: TextView?) : RecyclerView.AdapterDataObserver() {
    // 데이터가 없는 상황에서 사용할 뷰
    private var emptyView: TextView? = null
    // 데이터가 있는 상황에서 사용할 뷰
    private var recyclerView: RecyclerView? = null

    init {
        recyclerView = rv
        emptyView = tv
        checkIfEmpty()
    }

    // 데이터의 개수에 따른 View Visibility 설정
    private fun checkIfEmpty() {
        if (emptyView != null && recyclerView!!.adapter != null) {
            // 데이터의 개수가 0인지
            val emptyViewVisible = recyclerView!!.adapter!!.itemCount == 0

            // 데이터가 없으면 VISIBLE, 있으면 INVISIBLE
            emptyView!!.visibility = if (emptyViewVisible)
                View.VISIBLE else View.INVISIBLE
            // 데이터가 없으면 INVISIBLE, 있으면 VISIBLE
            recyclerView!!.visibility = if (emptyViewVisible)
                View.INVISIBLE else View.VISIBLE
        }
    }

    // 데이터의 변화에 따라 호출되는 메소드
    override fun onChanged() {
        super.onChanged()
        checkIfEmpty()
    }
}

위의 코드에서는 View의 Visibility를 VISIBLE과 INVISIBLE로 설정했지만, 상황에 따라 VISIBLE과 GONE으로 설정할 수도 있습니다.

registerAdapterDataObserver를 통해 등록

// RecyclerView 설정
val emptyObserver = EmptyDataObserver(binding.monthRecycler, binding.tvNoItem)
adapter = MonthRecyclerAdapter()
binding.monthRecycler.adapter = adapter
adapter.registerAdapterDataObserver(emptyObserver)

EmptyDataObserver의 인자로는 데이터가 있는 상황에서 사용할 RecyclerView와 데이터가 없는 상황에서 사용할 TextView를 전달하였습니다. 그 후 Adapter를 초기화한 후 registerAdapterDataObserver 메소드를 통해 AdapterDataObserver를 등록합니다.


결과


참조
Empty Dataset In RecyclerView

틀린 부분은 댓글로 남겨주시면 수정하겠습니다..!!

profile
되새기기 위해 기록

0개의 댓글