Mobile/Android(Java)

[Android/java] SwipeRefreshLayout을 이용하여 당겨서 리스트 새로고침구현하기

개발왕 금골드 2020. 4. 12. 14:32
반응형

안녕하세요 골드입니다.

오늘은 스와이프해서 리스트를 새로 고침하는 방법에 대해서 알아보겠습니다.

Swipe는 화면을 아래로 당기듯이 드래그하는 것을 말합니다.

핸드폰 화면은 한정되어 있기 때문에 따로 새로고침 버튼을 두는 것도 좋지만

Swipe 새로고침을 많이 사용하고 있습니다.

 

이번 포스팅에서 저는 RecyclerView를 사용한 앱을 미리 만들어놨습니다.

여기에 swipe refresh기능을 추가하도록 할 것입니다. 아마 이 글을 보는 분들도 이런 상황일 것이라고 생각합니다.

헷갈리지 않도록 잘 써보도록 하겠습니다.

 

1. RecyclerView 부모 레이아웃으로 SwipeRefreshLayout 추가

최상위 레이아웃으로 SwipeRefreshLayout을 설정했습니다.

SwipeRefreshLayout은 Swipe기능이 추가된 단순 layout입니다.

최상위에 두는 이유는 화면 전체를 새로고침하기 위함입니다.

최상위 레이아웃의 id값을 설정하겠습니다.

 

최상위 레이아웃 밑에 RecyclerView가 있습니다.

만약 다른 레이아웃이라도 최상위 레이아웃을 SwipeRefreshLayout으로 두고

그 안에 레이아웃 코드를 집어넣으면 되겠습니다.

 

 

 

2. 메인 코드에서 SwipeRefreshLayout 참조

Activity가 아닌 Fragment를 상속받고 있다는 점에 주의하세요.

밑줄 친 부분이 Swipe를 위해 추가한 코드입니다.

전역변수로 두고 onCreateView에서 SwipeRefreshLayout을 참조합니다.

(Fragment를 상속받고 있기 때문에 onCreateView에서 참조합니다.)

 

onViewCreated에 리프레시 리스너를 설정합니다.

오버라이드된 onRefresh() 안에 리프레시 되었을 경우를 여러분의 상황에 맞게 코딩합니다.

일반적으로 리스트를 업데이트하는 코드를 추가할 것입니다.

 

그 전에 먼저 여러분의 리스트를 처음 Set하는 코드 안에

clear()와

notifyDataSetChanged()를 추가합니다.

그리고 마지막에 setRefreshing(false)를 추가합니다. 

이 한 줄은 '새로고침' 표시를 없애는 역할을 합니다.

 

 

새로운 리스너를 정의합니다.

저는 아까 onRefresh 안에 updateEarthquakes()를 넣었습니다.

 

실제로 보면 아시겠지만 리스너를 정의할뿐 이 곳에서 업데이트가 이루어지는 것은 아닙니다.

실제 업데이트는 부모 액티비티를 통해 소통하는 뷰 모델이 수행합니다.

 

 

3. 부모 액티비티에서 인터페이스 구현 

부모 액티비티 클래스 안에 2번에서 정의한 인터페이스를 implements합니다.

필수로 구현해야 하는 onListFragmentRefreshRequested() 안에 update 코드를 작성합니다.

update 코드 안에 저는 뷰 모델을 변경하도록 요청하였습니다.

만약 뷰 모델을 사용하지 않으신다면 단순히 변경된 사항을 작성하시면 됩니다.

 

그럼 가상머신으로 실행해보겠습니다.

 

새로고침이 사용되는 것을 볼 수 있습니다.

 

여기까지 골드였습니다.

감사합니다.

 

참고자료 : Professional Android

반응형