문제 정의

Untitled

Home 화면에서 데이터를 서버에서 가져올 때 빈화면에서 갑자기 데이터가 보여지는 것이 어색할 수 있습니다. 또한 현재 데이터를 받아오는 건지 아님 앱이 멈춘건지 앱을 사용하는 유저들은 내부를 살펴볼 수 없으니 데이터를 가져오는 중인 것을 사용자에게 알려주기 위해서 로딩뷰를 구현하는데요

홈 화면에서 데이터를 가져올 때 로딩뷰를 활용해서 데이터 응답 전에 보여주도록 구현을 해보시면 좋을 것 같습니다.

문제 정의

device-2023-05-22-161047.mp4

  1. Progress Bar를 레이아웃에 큰 화면으로 배치하기

    (화면 꽉채운, 흰색 배경으로 설정해 뒤에 리스트 생성 과정 안보이도록)

    <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/progress_bar_follower"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:elevation="1dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">
    
            <ProgressBar
                android:layout_width="0dp"
                android:layout_height="80dp"
                android:background="@color/white"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    
        </androidx.constraintlayout.widget.ConstraintLayout>
    
  2. observer에서 서버에서 필요한 모든 데이터를 받아올 때까지만 visible하도록 설정

    // 뷰모델 observer 설정
    viewModel.followerResult.observe(viewLifecycleOwner) {followerResult ->
        val responseList = followerResult.data.toMutableList()
        responseList.let {
            followerList.addAll(responseList)
        }
        followerAdapter.submitList(followerList.toList())
    
    		// 두 페이지의 12명이 모두 들어올 때까지 보이도록 설정
        if (followerList.size == 12) {
            binding.progressBarFollower.visibility = View.GONE
        }
    
    }
    viewModel.errorResult.observe(viewLifecycleOwner) { errorResult ->
        Timber.d("서버 통신 실패 : $errorResult")
        binding.root.makeSnackBar(getString(R.string.snackbar_server_failure))
    }
    
    // 서버 통신으로 User 리스트 받아오기
    viewModel.addListFromServer(1)
    viewModel.addListFromServer(2)
    

→ 이 방식보다 더 좋은 적용 방식이 있을 것으로 생각됨