리스트뷰에서 어댑터가 비어있는경우, 내용없다고 표시 띄어주기

참고:
Udacity
머티리얼 디자인 가이드(Empty States)
setEmptyView()






[띄어줄 TextView구현하기]
리스트뷰에서 가져올 결과가 없을 시 띄어줄 TextView를 같은 계층에 구현해준다. rootview는 하나만 있어야하므로 이 둘의 뷰를 RelativeLayout으로 감싸준다. cf) multiple root tags


[리스트뷰만 있는 코드]
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/list"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent" 
          android:divider="@null"
          android:dividerHeight="0dp"    />


[비어있는 상태를 표시해 줄 TextView와 루트뷰인 RelativeRayout]
<RelativeLayout    
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".EarthquakeActivity"
    >

    <ListView 
          android:id="@+id/list"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:divider="@null"
          android:dividerHeight="0dp"
        /> 

   <TextView
        android:id="@+id/empty_view"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_centerInParent="true"
        android:textAppearance="?android:textAppearanceMedium"
        />

</RelativeLayout>



주목해서 봐야할 속성은, TextView안의 layout_centerInParent이다.

android:layout_centerInParent="true"

layout_XXX속성을 조합하지 않고, layout_centerInParent속성을 true로 지정해주면 뷰가 부모뷰의 정중앙에 위치하게된다.

그리고, TextView안에 text속성을 지정해주지 않은점도 눈여겨봐놓자.




이제 리스트뷰를 뿌려주는 액티비티 자바파일로 돌아가서, 멤버변수 TextView를 지정해주자.

TextView mEmptyStateTextView;




onCreate메서드에서 setEmptyView메서드를 사용해서, 어댑터가 비어있는경우 위에서 지정한 TextView가 화면에 뜨도록 구현해준다.

mEmptyStateTextView = (TextView) findViewById(R.id.empty_view);
listView.setEmptyView(mEmptyStateTextView);

조건문에 isEmpty()를 사용해서 어댑터가 비어있는지 확인할 필요가 없다. setEmptyView메서드 자체가 어댑터가 비어있는지 확인해주기 때문이다.




TextView안에 text속성을 지정해주지 않은 이유는 다음과 같다. 앱을 켜서 데이터를 최초로 불러오는 경우, 불러올 수 있는 데이터가 있음에도 불구하고 처음 데이터를 불러오는것이기 때문에 어댑터가 비어있기 때문이다. 이를 방지하기위해 레이아웃파일안에서 텍스트를 지정해주지 않았다.(레이아웃의 TextView에 text속성을 지정해주고 앱을 실행시켜보면 왜 속성을 지정해주지 않았는지 알 수 있을것이다.)


코드 상 데이터를 불러오고 난 다음 실행되는 메서드 내에서 텍스트를 지정해주면된다. 로더를 사용해서 데이터를 불러오는 경우 onLoadFinished() 내에 setText를 사용해 원하는 문자열을 띄어주면된다.

mEmptyStateTextView.setText(R.string.emtpy_list);


댓글

이 블로그의 인기 게시물

API 요청 URL(URI) 만들기(조합하기) -Uri.Builder사용하기-

TextView에 글자를 넣어주는 방법(setText, append)

텍스트 뷰의 배경을 원형 이미지로 지정하고, 배경 색상 채우기(안드로이드)