시작하며...
태그 화면의 포스트 리스트에서 하나 더 추가했으면 하는 기능이 바로 새로 고침이었습니다. 모바일 웹 브라우저에서 위에서 아래로 당기면 현재 웹 페이지를 다시 로딩하는 기능 있죠? 그와 같은 기능을 제가 만든 포스트 리스트에도 구현하고 싶었습니다. 안드로이드에서는 SwipeRefreshLayout 뷰를 이용하면 가능합니다.
작업 개요
- build.gradle 파일에 swiperefreshlayout 라이브러리 추가
- fragment_tags.xml 레이아웃에 SwipeRefreshLayout 뷰 추가
- TagsViewModel 클래스의 readRankedPost 메소드 수정
- TagsFragment 클래스 수정
build.gradle 파일에 swiperefreshlayout 라이브러리 추가
dorian-steem-ui 모듈의 build.gradle 파일에 swiperefreshlayout 라이브러리를 아래와 같이 추가하였습니다.
dependencies {
// ...
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0'
// ...
}
fragment_tags.xml 레이아웃에 SwipeRefreshLayout 뷰 추가
RecyclerView 뷰가 있던 자리에 SwipeRefreshLayout 뷰를 정의했구요. 전자를 후자 안으로 넣었어요.
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipe_refresh_post_list"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/radiogroup_sort"
app:layout_constraintBottom_toBottomOf="parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/list_post_item"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:postItemList="@{viewModel.rankedPosts}"
tools:listitem="@layout/layout_post_item" />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
TagsViewModel 클래스의 readRankedPost 메소드 수정
readRankedPost 메소드에 handleAfterReading 함수 파라메터를 추가하였구요. API 실행 성공/실패시 이를 호출하게 했습니다.
fun readRankedPosts(
tag: String,
limit: Int = this.limit,
handleAfterReading: (() -> Unit) = {}
) {
rankedPosts.value = mutableListOf()
readRankedPostsUseCase(
sort.value ?: GetRankedPostParamsDTO.InnerParams.SORT_TRENDING,
tag
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.onErrorReturn { error ->
error.printStackTrace()
liveThrowable.value = error
handleAfterReading()
listOf()
}
.subscribe { rankedPostItemList ->
rankedPosts.value = rankedPostItemList.toMutableList()
handleAfterReading()
}
.also { disposable ->
compositeDisposable.add(disposable)
}
}
TagsFragment 클래스 수정
TagsViewModel 객체의 readRankedPost 메소드를 호출하는 곳이 여러 곳 있었는데요. 하나의 함수를 정의, 사용하는 것으로 변경했습니다. SwipeRefreshLayout 뷰에서 로딩 중임을 보여주는 아이콘을 띄울 수 있는데요. 그것은 이 뷰의 isRefreshing 필드를 true로 설정하면 됩니다. 이를 다시 false로 바꿔 주면, 로딩 아이콘은 사라집니다. API 실행시 이를 보여주고 완료시 이를 숨기게 했습니다.
private fun readRankedPosts() {
val tag = activityViewModel.currentTag.value ?: ""
val sort = viewModel.sort.value ?: ""
if (sort.isEmpty()) {
showToastShortly(getString(R.string.error_sort_is_not_set))
return
}
binding.swipeRefreshPostList.isRefreshing = true
viewModel.readRankedPosts(
tag
) {
binding.swipeRefreshPostList.isRefreshing = false
}
}
그리고 SwipeRefreshLayout 뷰가 사용자의 제스처(위에서 아래로)를 감지하여 새로 고침을 실행하는 리스너도 정의하였습니다.
private val swipeRefreshPostListRefreshListener = OnRefreshListener {
readRankedPosts()
}
GitHub Commit
마치며...
지난 스팀 앱 개발기
- #78 - 태그 화면에서 포스트들의 디폴트 썸네일 변경
- #77 - 태그 화면에서 썸네일 없는 포스트 항목에 엉뚱한 썸네일이 보이는 오류
- #76 - 태그 검색시 앱이 죽는 버그 수정
- #75 - 태그 화면의 포스트 항목에 태그/커뮤니티 표시
- #74 - 태그 화면에서 포스트 리스트 추가 로딩시 깜빡임 문제 해결
- #73 - 태그 화면의 포스트 리스트에 무한 스크롤 적용
- #72 - 태그 화면의 포스트 리스트에서 항목들 사이 분리선 보이기
- #71 - 태그 화면에서 포스트 항목들의 썸네일 로딩
- #70 - 태그 화면 1차 구현
- #69 - 태그 화면에 데이터 바인딩 적용
- #68 - 태그 화면(TagsFragment) 구성
- #67 - TagsViewModel 클래스에 포스트 리스트 구하는 메소드 그리고 라이브 데이터 추가
- #66 - bridge.get_ranked_posts API 연동 구현: ReadRankedPostsUseCase 클래스 추가
- #65 - bridge.get_ranked_posts API 연동 구현: SteemRepository 인터페이스, SteemRepositoryImpl 클래스 수정
- #64 - bridge.get_ranked_posts API 연동 구현: SteemService 인터페이스에 메소드 추가
- #63 - bridge.get_ranked_posts API 관련 데이터 클래스 추가 수정
- #62 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 수정
- #61 - layout_post_item.xml 수정 후 예상치 못한 빌드 오류
- #60 - bridge.get_ranked_posts API의 응답 자료를 맡을 데이터 클래스 정의
- #59 - 태그별 포스트 리스트를 구하기 위한 bridge.get_ranked_posts API
- #58 - 포스트 리스트를 구성할 항목의 레이아웃 (3) 데이터 클래스 정의 및 데이터 바인딩 적용
- #57 - 포스트 리스트를 구성할 항목의 레이아웃 (2)
- #56 - 포스트 리스트를 구성할 항목의 레이아웃
- #55 - .gitignore 파일 작성
- #54 - RxJava 관련 메모리 누수 방지 코드 작성
- #53 - 버그 수정: 인터넷 미연결시 API 실행하면 앱 강제 종료
- #52 - 인터넷 미연결시 API 실행하면 어떻게 될까?
- #51 - 파워다운 끝났으나 SP to power down 값이 0이 아닌 버그
- #1 ~ #50
Posted through the AVLE Dapp (https://avle.io)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
화이팅입니다
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
감사합니다. 느리지만 꾸준히 해보겠습니다.
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit