Android/Side Projects

도서 리뷰 앱 개발하기

화요밍 2022. 2. 14. 19:51
728x90
반응형
Side Project - Book Review App
인터파크 도서 Open API를 사용해서 베스트 셀러 목록을 보여주고 검색을 통해 책을 검색하는 도서 리뷰 앱 프로젝트

 

 

GitHub - hwayeon351/Book-Review-App

Contribute to hwayeon351/Book-Review-App development by creating an account on GitHub.

github.com


학습 회고

오늘은 도서 리뷰 앱에 검색 히스토리를 클릭해서 검색을 하는 기능과 검색 결과가 없으면 TextView에 명시해주는 추가적인 구현을 마쳤다.


오늘 공부한 내용

  • 이전 검색 히스토리를 통해 재검색 기능 구현하기

EditText를 클릭해서 이전에 검색한 히스토리가 존재하면 historyRecyclerView에 띄워주었다.

그 중 재검색을 위해 키워드를 클릭하면 다시 해당 키워드로 검색이 이뤄지고 결과를 bookRecyclerView에 띄워주도록 구현하였다.

이를 위해 먼저 historyAdapter에 클릭 이벤트 리스너를 등록해주었다.

class HistoryAdapter(val historyDeleteClickedListener: (String) -> Unit, val historyKeywordClicktedListener: (String) -> Unit): ListAdapter<History, HistoryAdapter.HistoryItemViewHolder>(diffUtil) {

    inner class HistoryItemViewHolder(private val binding: ItemHistoryBinding): RecyclerView.ViewHolder(binding.root) {

        fun bind(historyModel: History) {
            binding.historyKeywordTextView.text = historyModel.keyword
            binding.historyKeywordTextView.setOnClickListener {
                historyKeywordClicktedListener(historyModel.keyword.orEmpty())
            }
            binding.historyKeywordDeleteButton.setOnClickListener {
                historyDeleteClickedListener(historyModel.keyword.orEmpty())
            }
        }
    }

historyKeywordTextView를 클릭하면 검색이 이뤄질 수 있도록 하기 위해 TextView에 리스너를 달아주었고 매개변수로 키워드를 넣어주었다.

 

그리고 MainActivity에서 historyAdapter 객체를 생성할 때 클릭 이벤트 리스너를 정의해주었다.

historyAdapter = HistoryAdapter(
    historyDeleteClickedListener = {
    deleteSearchKeyword(it)
}, historyKeywordClicktedListener = {
    search(it, true)
})

매개변수로 들어온 값을 search() 메서드의 첫 번째 매개변수로 담아주고, 두 번째 매개변수로는 이전에 검색했던 키워드로 재검색하였을 때 키워드가 중복적으로 히스토리에 추가되지 않도록 하기 위해 isAlreadyExist 값을 true로 넘겼다.

 

 

 

  • 검색 결과가 없으면 TextView에 명시해주기

검색 결과가 없으면 빈 화면이 출력되었는데 사용자에게 검색 결과가 없다는 것을 명시적으로 알려주기 위해 activity_main.xml에 TextView를 추가하였다. 검색 결과가 출력되는 bookRecyclerView와 같은 사이즈, 위치를 설정해주었다.

그리고 중앙에 텍스트를 정렬하기 위해 gravity 속성값을 center로 지정하였다.

<TextView
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:gravity="center"
    android:text="검색 결과가 존재하지 않습니다."
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/searchEditText" />

<androidx.recyclerview.widget.RecyclerView
    android:id="@+id/bookRecyclerView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:background="@color/white"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/searchEditText"
    tools:listitem="@layout/item_book" />

 

검색 결과가 있는 경우에는 bookRecycler를 visible로, 결과가 없는 경우에는 bookRecycler를 gone으로 바꿔줌으로써 bookRecyclerView 뒤에 존재하는 TextView가 가려지거나 보여지게 하였다.

검색 결과를 받아오는 response.body()에 books가 null인 경우, hideBookRecyclerView()를 호출하였다.

books가 있다면 어댑터에 새로운 리스트를 추가하는 submitList()를 호출하고 showBookRecyclerView()를 호출해주었다.

private fun search(keyword: String, isAlreadyExist: Boolean) {
    bookService.getBooksByName(getString(R.string.interParkAPIKey), keyword)
        .enqueue(object: Callback<SearchBookDto> {
            override fun onResponse(
                call: Call<SearchBookDto>,
                response: Response<SearchBookDto>
            ) {
                hideHistoryView()
                if (isAlreadyExist.not()) saveSearchKeyword(keyword)
                if (response.isSuccessful.not()) {
                    Log.e(TAG, "NOT!! SUCCESS")
                    return
                }
                if(response.body()?.books.isNullOrEmpty()) hideBookRecyclerView()
                else {
                    adapter.submitList(response.body()?.books)
                    showBookRecyclerView()
                }
            }

            override fun onFailure(call: Call<SearchBookDto>, t: Throwable) {
                hideHistoryView()
                Log.e(TAG, t.toString())
            }

        })
}
private fun hideBookRecyclerView() {
    binding.bookRecyclerView.isVisible = false
}

private fun showBookRecyclerView() {
    binding.bookRecyclerView.isVisible = true
}

 

 


※ 본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

 

728x90
반응형

'Android > Side Projects' 카테고리의 다른 글

Tinder 앱 개발하기  (0) 2022.02.16
Tinder 앱 개발하기  (0) 2022.02.15
도서 리뷰 앱 개발하기  (0) 2022.02.13
도서 리뷰 앱 개발하기  (0) 2022.02.12
도서 리뷰 앱 개발하기  (0) 2022.02.11