From 5ed9cadd601e5eb0983422149f622ba0e17ac0a1 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 29 Aug 2023 18:23:23 +0900 Subject: [PATCH] =?UTF-8?q?[mod]=20#170=20=EB=A7=88=EC=9D=B4=ED=94=BC?= =?UTF-8?q?=EB=93=9C=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=9D=BC=EB=B6=80?= =?UTF-8?q?=EB=A7=8C=20=EC=82=AD=EC=A0=9C=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/mypage/myfeed/MyFeedAdapter.kt | 26 +++++----- .../main/mypage/myfeed/MyFeedFragment.kt | 49 +++++++++++-------- .../main/mypage/myfeed/MyFeedViewModel.kt | 7 +-- app/src/main/res/layout/fragment_myfeed.xml | 2 +- 4 files changed, 48 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedAdapter.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedAdapter.kt index d71810b3..d8f53557 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedAdapter.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedAdapter.kt @@ -3,7 +3,6 @@ package com.android.go.sopt.winey.presentation.main.mypage.myfeed import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.paging.ItemSnapshotList import androidx.paging.PagingDataAdapter import androidx.recyclerview.widget.RecyclerView import com.android.go.sopt.winey.databinding.ItemMyfeedPostBinding @@ -12,18 +11,13 @@ import com.android.go.sopt.winey.util.view.ItemDiffCallback import com.android.go.sopt.winey.util.view.setOnSingleClickListener class MyFeedAdapter( - private val onlikeButtonClicked: (WineyFeed: WineyFeed) -> Unit, - private val onPopupMenuClicked: (View, WineyFeed: WineyFeed) -> Unit, - private val toFeedDetail: (WineyFeed: WineyFeed) -> Unit + private val onlikeButtonClicked: (WineyFeed) -> Unit, + private val onPopupMenuClicked: (View, WineyFeed) -> Unit, + private val toFeedDetail: (WineyFeed) -> Unit ) : PagingDataAdapter(diffUtil) { - private val currentData: ItemSnapshotList - get() = snapshot() - class MyFeedViewHolder( - private val binding: ItemMyfeedPostBinding, - private val onlikeButtonClicked: (WineyFeed: WineyFeed) -> Unit, - private val onPopupMenuClicked: (View, WineyFeed: WineyFeed) -> Unit, - private val toFeedDetail: (WineyFeed: WineyFeed) -> Unit + inner class MyFeedViewHolder( + private val binding: ItemMyfeedPostBinding ) : RecyclerView.ViewHolder(binding.root) { fun onBind(data: WineyFeed?) { binding.apply { @@ -50,7 +44,7 @@ class MyFeedAdapter( ): MyFeedViewHolder { val binding = ItemMyfeedPostBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return MyFeedViewHolder(binding, onlikeButtonClicked, onPopupMenuClicked, toFeedDetail) + return MyFeedViewHolder(binding) } override fun onBindViewHolder(holder: MyFeedViewHolder, position: Int) { @@ -67,6 +61,14 @@ class MyFeedAdapter( } } + fun deleteItem(feedId: Int): MutableList { + val currentList = snapshot().items + val newList = currentList.toMutableList() + val feed = currentList.find { it.feedId == feedId } + newList.remove(feed) + return newList + } + companion object { private val diffUtil = ItemDiffCallback( onItemsTheSame = { old, new -> old.feedId == new.feedId }, diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedFragment.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedFragment.kt index f01173cf..73e2bee7 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedFragment.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedFragment.kt @@ -15,6 +15,7 @@ import androidx.lifecycle.flowWithLifecycle import androidx.lifecycle.lifecycleScope import androidx.lifecycle.repeatOnLifecycle import androidx.paging.LoadState +import androidx.paging.PagingData import androidx.recyclerview.widget.SimpleItemAnimator import com.android.go.sopt.winey.R import com.android.go.sopt.winey.databinding.FragmentMyfeedBinding @@ -23,8 +24,6 @@ import com.android.go.sopt.winey.presentation.main.feed.WineyFeedLoadAdapter import com.android.go.sopt.winey.presentation.main.feed.detail.DetailActivity import com.android.go.sopt.winey.presentation.main.mypage.MyPageFragment import com.android.go.sopt.winey.util.binding.BindingFragment -import com.android.go.sopt.winey.util.context.stringOf -import com.android.go.sopt.winey.util.context.wineySnackbar import com.android.go.sopt.winey.util.fragment.WineyDialogFragment import com.android.go.sopt.winey.util.fragment.snackBar import com.android.go.sopt.winey.util.fragment.stringOf @@ -52,11 +51,14 @@ class MyFeedFragment : BindingFragment(R.layout.fragment_ override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + removeRecyclerviewItemChangeAnimation() initAdapter() + initBackButtonClickListener() + initGetFeedStateObserver() initPostLikeStateObserver() - initButtonClickListener() + initDeleteFeedStateObserver() } override fun onStart() { @@ -112,20 +114,37 @@ class MyFeedFragment : BindingFragment(R.layout.fragment_ showAsDropDown(anchorView, -POPUP_MENU_OFFSET, -POPUP_MENU_OFFSET, Gravity.END) } - private fun showFeedDeleteDialog(wineyFeed: WineyFeed) { + private fun showFeedDeleteDialog(feed: WineyFeed) { val dialog = WineyDialogFragment( stringOf(R.string.feed_delete_dialog_title), stringOf(R.string.feed_delete_dialog_subtitle), stringOf(R.string.comment_delete_dialog_negative_button), stringOf(R.string.comment_delete_dialog_positive_button), handleNegativeButton = {}, - handlePositiveButton = { viewModel.deleteFeed(wineyFeed.feedId) } + handlePositiveButton = { + viewModel.deleteFeed(feed.feedId) + deletePagingDataItem(feed.feedId) + } ) dialog.show(parentFragmentManager, TAG_FEED_DELETE_DIALOG) - initDeleteFeedStateObserver() } - private fun initButtonClickListener() { + private fun deletePagingDataItem(feedId: Int) { + viewLifeCycleScope.launch { + val newList = myFeedAdapter.deleteItem(feedId) + checkEmptyList(newList) + myFeedAdapter.submitData(PagingData.from(newList)) + } + } + + private fun checkEmptyList(newList: MutableList) { + if (newList.isEmpty()) { + binding.rvMyfeedPost.isVisible = false + binding.clMyfeedEmpty.isVisible = true + } + } + + private fun initBackButtonClickListener() { binding.imgMyfeedBack.setOnSingleClickListener { navigateTo() parentFragmentManager.popBackStack() @@ -136,7 +155,6 @@ class MyFeedFragment : BindingFragment(R.layout.fragment_ viewModel.deleteMyFeedState.flowWithLifecycle(viewLifeCycle).onEach { state -> when (state) { is UiState.Success -> { - refreshMyFeed() wineySnackbar(requireView(), true, stringOf(R.string.snackbar_feed_delete_success)) } @@ -150,7 +168,7 @@ class MyFeedFragment : BindingFragment(R.layout.fragment_ } private fun initGetFeedStateObserver() { - viewLifecycleOwner.lifecycleScope.launch { + viewLifeCycleScope.launch { viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { viewModel.getMyFeedListState.collectLatest { state -> when (state) { @@ -158,14 +176,13 @@ class MyFeedFragment : BindingFragment(R.layout.fragment_ myFeedAdapter.addLoadStateListener { loadState -> when (loadState.refresh) { is LoadState.Loading -> { - binding.lMyfeedEmpty.isVisible = false + binding.clMyfeedEmpty.isVisible = false binding.rvMyfeedPost.isVisible = false } is LoadState.NotLoading -> { binding.rvMyfeedPost.isVisible = myFeedAdapter.itemCount > 0 - binding.lMyfeedEmpty.isVisible = - myFeedAdapter.itemCount == 0 + binding.clMyfeedEmpty.isVisible = myFeedAdapter.itemCount == 0 restoreScrollPosition() } @@ -208,14 +225,6 @@ class MyFeedFragment : BindingFragment(R.layout.fragment_ }.launchIn(viewLifeCycleScope) } - private fun refreshMyFeed() { - val fragmentManager = requireActivity().supportFragmentManager - fragmentManager.beginTransaction().apply { - replace(R.id.fcv_main, MyFeedFragment()) - commit() - } - } - private fun navigateToDetail(wineyFeed: WineyFeed) { selectedItemIndex = myFeedAdapter.snapshot().indexOf(wineyFeed) selectedScrollPosition = binding.rvMyfeedPost.layoutManager?.onSaveInstanceState() diff --git a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedViewModel.kt b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedViewModel.kt index 1f1352b9..25b2805f 100644 --- a/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedViewModel.kt +++ b/app/src/main/java/com/android/go/sopt/winey/presentation/main/mypage/myfeed/MyFeedViewModel.kt @@ -23,16 +23,15 @@ import javax.inject.Inject class MyFeedViewModel @Inject constructor( private val feedRepository: FeedRepository ) : ViewModel() { - private val _getMyFeedListState = - MutableStateFlow>>(UiState.Loading) + MutableStateFlow>>(UiState.Empty) val getMyFeedListState: StateFlow>> = _getMyFeedListState.asStateFlow() private val _postMyFeedLikeState = MutableStateFlow>(UiState.Empty) val postMyFeedLikeState: StateFlow> = _postMyFeedLikeState.asStateFlow() - val _deleteMyFeedState = MutableStateFlow>(UiState.Loading) + private val _deleteMyFeedState = MutableStateFlow>(UiState.Empty) val deleteMyFeedState: StateFlow> = _deleteMyFeedState.asStateFlow() init { @@ -47,6 +46,7 @@ class MyFeedViewModel @Inject constructor( private fun postLike(feedId: Int, requestPostLikeDto: RequestPostLikeDto) { viewModelScope.launch { _postMyFeedLikeState.emit(UiState.Loading) + feedRepository.postFeedLike(feedId, requestPostLikeDto) .onSuccess { response -> _postMyFeedLikeState.emit(UiState.Success(response)) @@ -58,6 +58,7 @@ class MyFeedViewModel @Inject constructor( fun getMyFeed() { viewModelScope.launch { _getMyFeedListState.emit(UiState.Loading) + feedRepository.getMyFeedList().cachedIn(viewModelScope) .collectLatest { response -> _getMyFeedListState.emit(UiState.Success(response)) diff --git a/app/src/main/res/layout/fragment_myfeed.xml b/app/src/main/res/layout/fragment_myfeed.xml index aac6f256..000e9db4 100644 --- a/app/src/main/res/layout/fragment_myfeed.xml +++ b/app/src/main/res/layout/fragment_myfeed.xml @@ -61,7 +61,7 @@ app:layout_constraintTop_toBottomOf="@id/cl_detail_app_bar">