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("옐로 리스트 서버 통신 실패")) }