관리 메뉴

나만을 위한 블로그

[Android] 리사이클러뷰의 리스트에 데이터가 없을 때 '데이터가 없습니다' 텍스트뷰 띄우는 방법 본문

Android

[Android] 리사이클러뷰의 리스트에 데이터가 없을 때 '데이터가 없습니다' 텍스트뷰 띄우는 방법

참깨빵위에참깨빵 2021. 2. 17. 18:05
728x90
반응형

리사이클러뷰에 데이터가 없으면 "아직 작성된 글이 없어요" 같은 문장이 나오도록 하고 싶을 때가 있다.

그래서 레이아웃을 만든 뒤 include해서 사용해볼까 생각했는데 좀 더 간단한 방법이 있어서 기록하려고 포스팅한다.

 

먼저 클래스를 하나 만들어준다.

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView;

public class RecyclerViewEmptySupport extends RecyclerView
{
    private View emptyView;

    private AdapterDataObserver emptyObserver = new AdapterDataObserver()
    {
        @Override
        public void onChanged()
        {
            Adapter<?> adapter = getAdapter();
            if (adapter != null && emptyView != null)
            {
                if (adapter.getItemCount() == 0)
                {
                    emptyView.setVisibility(View.VISIBLE);
                    RecyclerViewEmptySupport.this.setVisibility(View.GONE);
                }
                else
                {
                    emptyView.setVisibility(View.GONE);
                    RecyclerViewEmptySupport.this.setVisibility(View.VISIBLE);
                }
            }
        }
    };

    @Override
    public void setAdapter(Adapter adapter)
    {
        super.setAdapter(adapter);

        if (adapter != null)
        {
            adapter.registerAdapterDataObserver(emptyObserver);
        }

        emptyObserver.onChanged();
    }

    public void setEmptyView(View emptyView)
    {
        this.emptyView = emptyView;
    }

    public RecyclerViewEmptySupport(@NonNull Context context)
    {
        super(context);
    }

    public RecyclerViewEmptySupport(@NonNull Context context, @Nullable AttributeSet attrs)
    {
        super(context, attrs);
    }

    public RecyclerViewEmptySupport(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }
}

AdapterDataObserver라는 클래스는 리사이클러뷰 클래스 안에 들어있는 추상 static 클래스다.

이 클래스는 리사이클러뷰 어댑터의 변경 사항을 확인할 때 사용하는 클래스다.

그래서 먼저 리사이클러뷰 클래스를 상속하는 클래스를 만들어준 뒤 AdapterDataObserver 객체를 통해 콜백을 호출한다. 기본적으로 호출되는 콜백은 없고 여러 콜백이 나타나며 이 중 필요한 것을 선택할 수 있는데 onChange()만 재정의해주면 된다.

그 안의 코드는 쉬운 코드기 때문에 설명은 생략한다.

 

그리고 setAdapter()도 재정의해서 어댑터가 리사이클러뷰에 붙어있을 경우 AdapterDataObserver 객체를 등록해서 어댑터의 변화를 감지할 수 있도록 한다.

 

이제 이렇게 만든 클래스를 사용해보자. 먼저 xml에서 리사이클러뷰 태그 안의 Recyclerview를 지우고 이렇게 쓴다.

<com.example.testprac.RecyclerViewEmptySupport
                            android:id="@+id/recycler"
                            android:layout_width="match_parent"
                            android:layout_height="match_parent"
                            android:orientation="vertical" />
                            
                            <TextView
                            android:id="@+id/list_empty"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_margin="20dp"
                            android:text="데이터가 없습니다"
                            android:textSize="17sp"
                            android:gravity="center"/>

 

위에서 생성한 RecyclerViewEmptySupport 클래스를 xml에 등록해주는 것 뿐이다. 어차피 리사이클러뷰를 상속받아 만든 클래스기 때문에 이렇게 써도 별 문제는 없다. 밑에는 데이터가 없을 경우 문구를 보여줄 텍스트뷰를 만들었다.

그리고 com.example.testprac 부분은 자기 프로젝트의 경로로 무조건 수정해줘야 한다.

마지막으로 액티비티/프래그먼트에 아래 코드를 추가한다.

list_empty = findViewById(R.id.list_empty);
recycler.setEmptyView(list_empty);

 

레이아웃 매니저, findViewById(), setAdapter() 등 처리를 모두 해준 다음 텍스트뷰 참조 객체를 xml의 텍스트뷰와 매핑시켜주고 setEmptyView()를 호출해서 텍스트뷰 참조 객체를 넣어주면 끝이다.

하드코딩으로 데이터를 추가해서든, 서버에서 데이터를 받아오는 게 없는 경우든 "데이터가 없습니다" 문구가 잘 보이는 걸 확인할 수 있다.

 

참고)

 

developer.android.com/reference/androidx/recyclerview/widget/RecyclerView.AdapterDataObserver#onChanged()

 

RecyclerView.AdapterDataObserver  |  Android 개발자  |  Android Developers

RecyclerView.AdapterDataObserver public static abstract class RecyclerView.AdapterDataObserver extends Object java.lang.Object    ↳ androidx.recyclerview.widget.RecyclerView.AdapterDataObserver Observer base class for watching changes to an RecyclerVi

developer.android.com

stackoverflow.com/questions/28217436/how-to-show-an-empty-view-with-a-recyclerview

 

How to show an empty view with a RecyclerView?

I am used to put an special view inside the layout file as described in the ListActivity documentation to be displayed when there is no data. This view has the id "android:id/empty".

stackoverflow.com

myung6024.tistory.com/44

 

리사이클러뷰 변화를 감지하는 registerAdapterDataObserver

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.AdapterDataObserver 불러오는 중입니다... 리사이클러뷰의 데이터가 변했거나 추가되었을 때 어떤 행위를 해야 하는 경우가 있..

myung6024.tistory.com

 

반응형
Comments