From f0de0e59f8a6beca4f615feb9fb619dc2714d42d Mon Sep 17 00:00:00 2001 From: Leekangmin Date: Mon, 17 Jul 2023 18:38:19 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT/#42]=20=EB=82=B4=20=EC=98=90=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=EB=B3=B4=EA=B8=B0=20=EC=84=9C=EB=B2=84?= =?UTF-8?q?=ED=86=B5=EC=8B=A0=20=EB=94=94=ED=85=8C=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/myyello/MyYelloFragment.kt | 29 +++++++++++-------- .../main/myyello/MyYelloViewModel.kt | 25 ++++++++++------ 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/yello/presentation/main/myyello/MyYelloFragment.kt b/app/src/main/java/com/yello/presentation/main/myyello/MyYelloFragment.kt index a9860df4a..b9c59a43e 100644 --- a/app/src/main/java/com/yello/presentation/main/myyello/MyYelloFragment.kt +++ b/app/src/main/java/com/yello/presentation/main/myyello/MyYelloFragment.kt @@ -1,6 +1,7 @@ package com.yello.presentation.main.myyello import android.os.Bundle +import android.util.Log import android.view.View import androidx.fragment.app.viewModels import androidx.lifecycle.flowWithLifecycle @@ -12,6 +13,7 @@ import com.example.ui.fragment.toast import com.example.ui.view.UiState import com.yello.R import com.yello.databinding.FragmentMyYelloBinding +import com.yello.presentation.main.myyello.read.MyYelloReadActivity import com.yello.presentation.util.BaseLinearRcvItemDeco import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.flow.launchIn @@ -32,7 +34,9 @@ class MyYelloFragment : BindingFragment(R.layout.fragmen private fun initView() { viewModel.getMyYelloList() - adapter = MyYelloAdapter() + adapter = MyYelloAdapter { + startActivity(MyYelloReadActivity.getIntent(requireContext(), it.id)) + } binding.rvMyYelloReceive.addItemDecoration( BaseLinearRcvItemDeco( 8, @@ -56,7 +60,6 @@ class MyYelloFragment : BindingFragment(R.layout.fragmen when (it) { is UiState.Success -> { adapter?.addItem(it.data.yello) - binding.tvCount.text = it.data.totalCount.toString() } is UiState.Failure -> { @@ -66,25 +69,27 @@ class MyYelloFragment : BindingFragment(R.layout.fragmen else -> {} } }.launchIn(viewLifecycleOwner.lifecycleScope) + + viewModel.totalCount.flowWithLifecycle(viewLifecycleOwner.lifecycle) + .onEach { + binding.tvCount.text = it.toString() + }.launchIn(viewLifecycleOwner.lifecycleScope) } + // 페이지네이션 private fun infinityScroll() { binding.rvMyYelloReceive.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) - // 화면에 보이는 마지막 아이템의 position - val lastVisibleItemPosition = - (recyclerView.layoutManager as LinearLayoutManager).findLastCompletelyVisibleItemPosition() - // 어댑터에 등록된 아이템의 총 개수 -1 - val itemTotalCount = adapter?.itemCount?.minus(1) - // 스크롤이 끝에 도달했는지 확인 - if (lastVisibleItemPosition != -1 && itemTotalCount != -1) { - if (lastVisibleItemPosition == itemTotalCount) { + if (dy > 0) { + if (!binding.rvMyYelloReceive.canScrollVertically(1) && + (recyclerView.layoutManager as LinearLayoutManager).findLastVisibleItemPosition() == adapter!!.itemCount - 1 + ) { viewModel.getMyYelloList() } - } } - }) + } + }) } override fun onDestroyView() { diff --git a/app/src/main/java/com/yello/presentation/main/myyello/MyYelloViewModel.kt b/app/src/main/java/com/yello/presentation/main/myyello/MyYelloViewModel.kt index 3d6c6bdfb..e50f1ff0b 100644 --- a/app/src/main/java/com/yello/presentation/main/myyello/MyYelloViewModel.kt +++ b/app/src/main/java/com/yello/presentation/main/myyello/MyYelloViewModel.kt @@ -1,15 +1,17 @@ package com.yello.presentation.main.myyello -import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.domain.entity.MyYello import com.example.domain.repository.YelloRepository import com.example.ui.view.UiState import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asSharedFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import javax.inject.Inject @@ -17,26 +19,31 @@ import javax.inject.Inject class MyYelloViewModel @Inject constructor( private val repository: YelloRepository ) : ViewModel() { - private val _myYelloData = MutableStateFlow>(UiState.Loading) + private val _myYelloData = MutableSharedFlow>() val myYelloData: SharedFlow> = _myYelloData.asSharedFlow() - private var currentPage = 0 + private val _totalCount = MutableStateFlow(0) + val totalCount: StateFlow = _totalCount.asStateFlow() + + private var currentPage = -1 private var isPagingFinish = false private var totalPage = Int.MAX_VALUE fun getMyYelloList() { if (isPagingFinish) return - _myYelloData.value = UiState.Loading + _myYelloData.tryEmit(UiState.Loading) viewModelScope.launch { repository.getMyYelloList(++currentPage) .onSuccess { totalPage = Math.ceil((it.totalCount * 0.1)).toInt() if (totalPage == currentPage) isPagingFinish = true - _myYelloData.value = when { - it.yello.isEmpty() -> UiState.Empty - else -> UiState.Success(it) - } - + _myYelloData.emit( + when { + it.yello.isEmpty() -> UiState.Empty + else -> UiState.Success(it) + } + ) + _totalCount.value = it.totalCount }.onFailure { _myYelloData.emit(UiState.Failure("옐로 리스트 서버 통신 실패")) }