일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Rxjava Observable
- 안드로이드 라이선스 종류
- 큐 자바 코드
- 자바 다형성
- 스택 큐 차이
- 2022 플러터 안드로이드 스튜디오
- jvm이란
- 안드로이드 os 구조
- 서비스 vs 쓰레드
- android retrofit login
- android ar 개발
- 안드로이드 유닛 테스트 예시
- 안드로이드 유닛 테스트
- 안드로이드 라이선스
- ar vr 차이
- 안드로이드 유닛테스트란
- rxjava hot observable
- 객체
- 안드로이드 레트로핏 사용법
- ANR이란
- 멤버변수
- 스택 자바 코드
- 서비스 쓰레드 차이
- rxjava disposable
- 클래스
- jvm 작동 원리
- rxjava cold observable
- 안드로이드 레트로핏 crud
- 2022 플러터 설치
- 플러터 설치 2022
- Today
- Total
나만을 위한 블로그
[Android] 리사이클러뷰의 리스트에 데이터가 없을 때 '데이터가 없습니다' 텍스트뷰 띄우는 방법 본문
리사이클러뷰에 데이터가 없으면 "아직 작성된 글이 없어요" 같은 문장이 나오도록 하고 싶을 때가 있다.
그래서 레이아웃을 만든 뒤 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()를 호출해서 텍스트뷰 참조 객체를 넣어주면 끝이다.
하드코딩으로 데이터를 추가해서든, 서버에서 데이터를 받아오는 게 없는 경우든 "데이터가 없습니다" 문구가 잘 보이는 걸 확인할 수 있다.
참고)
stackoverflow.com/questions/28217436/how-to-show-an-empty-view-with-a-recyclerview
'Android' 카테고리의 다른 글
[Android] 구글 애널리틱스 적용하는 방법 (0) | 2021.02.23 |
---|---|
[Android] EditText에 띄어쓰기 포함 글자수를 제한하는 방법 (0) | 2021.02.17 |
[Android] ScrollView 안의 Constraint Layout에서 뷰가 안 보일 때 해결법 (0) | 2021.02.12 |
[Android] 코틀린으로 카카오 로그인 구현하기 (0) | 2021.02.11 |
[Android] 코틀린으로 TabLayout, ViewPager, Fragment를 활용해서 화면 넘기기 구현하기 (0) | 2021.02.10 |