From 78102b554ac285abbe73a18697c98a60aec3f784 Mon Sep 17 00:00:00 2001 From: leeeha Date: Fri, 15 Dec 2023 01:29:13 +0900 Subject: [PATCH 01/61] =?UTF-8?q?[MOD]=20#264=20=EB=A7=88=EB=9D=BC?= =?UTF-8?q?=ED=86=A4=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=8D=B0=EC=BD=94?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=BD=94=EB=93=9C=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 --- .../util/custom/deco/DiscoverMarathonItemDecoration.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverMarathonItemDecoration.kt b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverMarathonItemDecoration.kt index 2c4ca9e2c..5078773dd 100644 --- a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverMarathonItemDecoration.kt +++ b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverMarathonItemDecoration.kt @@ -13,20 +13,20 @@ class DiscoverMarathonItemDecoration( ) : RecyclerView.ItemDecoration() { private val spaceSizePx = spaceSize.dpToPx(context) - // 리사이클러뷰 아이템 주위의 여백을 설정하는 함수 override fun getItemOffsets( outRect: Rect, // 아이템의 사각형 영역 view: View, // 아이템 뷰 parent: RecyclerView, state: RecyclerView.State ) { - // 마지막 아이템에 대해서만 오른쪽 여백 제거 - if (!checkLastItem(view, parent)) { + // 마지막 아이템 제외하고는 오른쪽 마진 추가 + if (!isLastItem(view, parent)) { outRect.right = spaceSizePx } } - private fun checkLastItem(view: View, parent: RecyclerView): Boolean { - return parent.getChildAdapterPosition(view) == itemCount - 1 + private fun isLastItem(view: View, parent: RecyclerView): Boolean { + val currentItemPosition = parent.getChildAdapterPosition(view) + return currentItemPosition == itemCount - 1 } } \ No newline at end of file From ad67a812e73c4a3ab81e72c3edc285bf14d17bbd Mon Sep 17 00:00:00 2001 From: leeeha Date: Fri, 15 Dec 2023 02:03:39 +0900 Subject: [PATCH 02/61] =?UTF-8?q?[ADD]=20#264=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=BD=94=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/DiscoverMultiViewHolder.kt | 13 ++++--- .../deco/DiscoverRecommendItemDecoration.kt | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 25a51387c..fbc945cde 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -8,8 +8,7 @@ import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration -import com.runnect.runnect.util.custom.deco.GridSpacingItemDecoration -import timber.log.Timber +import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) { @@ -22,6 +21,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : fun bind(marathonCourses: List) { binding.rvDiscoverMarathon.apply { setHasFixedSize(true) + adapter = DiscoverMarathonAdapter( onHeartButtonClick, onCourseItemClick, @@ -29,6 +29,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : ).apply { submitList(marathonCourses) } + addItemDecoration( DiscoverMarathonItemDecoration( context = context, @@ -60,11 +61,11 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } addItemDecoration( - GridSpacingItemDecoration( + DiscoverRecommendItemDecoration( context = context, - spanCount = 2, - horizontalSpaceSize = 6, - topSpaceSize = 20 + rightSpacing = 6, + bottomSpacing = 20, + spanCount = 2 ) ) } diff --git a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt new file mode 100644 index 000000000..5e67ac90d --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt @@ -0,0 +1,38 @@ +package com.runnect.runnect.util.custom.deco + +import android.content.Context +import android.graphics.Rect +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.runnect.runnect.util.extension.dpToPx + +class DiscoverRecommendItemDecoration( + context: Context, + rightSpacing: Int, + bottomSpacing: Int, + private val spanCount: Int +) : RecyclerView.ItemDecoration() { + private val rightSpacingPx = rightSpacing.dpToPx(context) + private val bottomSpacingPx = bottomSpacing.dpToPx(context) + + override fun getItemOffsets( + outRect: Rect, // 아이템의 사각형 영역 + view: View, // 아이템 뷰 + parent: RecyclerView, + state: RecyclerView.State + ) { + // 마지막 열 제외하고는 오른쪽 마진 추가 + if (!isLastColumn(view, parent)) { + outRect.right = rightSpacingPx + } + + // 모든 아이템에 대해서 아래쪽 마진 추가 + outRect.bottom = bottomSpacingPx + } + + // 마지막 열인지 검사하기 + private fun isLastColumn(view: View, parent: RecyclerView): Boolean { + val currentItemPosition = parent.getChildAdapterPosition(view) + return currentItemPosition % spanCount == spanCount - 1 + } +} From c04920dce7f3a94d9b6dd98f39960cc94fc99050 Mon Sep 17 00:00:00 2001 From: leeeha Date: Fri, 15 Dec 2023 02:38:05 +0900 Subject: [PATCH 03/61] =?UTF-8?q?[FIX]=20#264=20=EB=A7=88=EB=9D=BC?= =?UTF-8?q?=ED=86=A4=20=EC=BD=94=EC=8A=A4=20=EC=A0=84=EC=B2=B4=EA=B0=80=20?= =?UTF-8?q?=EC=95=84=EB=8B=88=EB=9D=BC=20=EC=9D=BC=EB=B6=80=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=EB=A7=8C=20=EA=B0=B1=EC=8B=A0=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 마라톤 코스 뷰홀더 안에서 어댑터의 notifyItemChanged 함수 호출하도록 --- .../adapter/DiscoverMarathonAdapter.kt | 12 +++++ .../adapter/DiscoverMultiViewAdapter.kt | 54 ++++--------------- .../adapter/DiscoverMultiViewHolder.kt | 40 ++++++++++---- 3 files changed, 52 insertions(+), 54 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt index 9594f9634..661d0ad56 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt @@ -9,6 +9,7 @@ import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMarathonBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.presentation.MainActivity +import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.callback.diff.ItemDiffCallback class DiscoverMarathonAdapter( @@ -18,6 +19,17 @@ class DiscoverMarathonAdapter( ) : ListAdapter(diffUtil) { + fun updateCourseItem(publicCourseId: Int, updatedCourse: EditableDiscoverCourse) { + currentList.forEachIndexed { index, course -> + if (course.id == publicCourseId) { + course.title = updatedCourse.title + course.scrap = updatedCourse.scrap + notifyItemChanged(index) + return@forEachIndexed + } + } + } + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMarathonViewHolder { return DiscoverMarathonViewHolder( ItemDiscoverMarathonBinding.inflate( diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index c85b7a8f4..44b26ce66 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -22,6 +22,8 @@ class DiscoverMultiViewAdapter( RECOMMEND } + private lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder + override fun getItemViewType(position: Int): Int { return when (multiViewItems[position].first()) { is MarathonCourse -> MultiViewType.MARATHON.ordinal @@ -64,6 +66,7 @@ class DiscoverMultiViewAdapter( override fun onBindViewHolder(holder: DiscoverMultiViewHolder, position: Int) { when (holder) { is DiscoverMultiViewHolder.MarathonCourseViewHolder -> { + marathonViewHolder = holder (multiViewItems[position] as? List)?.let { holder.bind(it) } @@ -83,54 +86,17 @@ class DiscoverMultiViewAdapter( ) { for (courses in multiViewItems) { for (course in courses) { - // todo: 해당하는 코스 id 발견하여 아이템 갱신하고 나면, 바로 함수 종료시키기 - if (findCourseItemByViewType(publicCourseId, course, updatedCourse)) { - Timber.e("SUCCESS COURSE ITEM UPDATE: ${publicCourseId}") - return - } - } - } - } + when (course) { + is MarathonCourse -> { + // todo: 마라톤 코스 뷰 홀더에서 어댑터 아이템 갱신하는 코드 실행 + marathonViewHolder.updateMarathonCourseItem(publicCourseId, updatedCourse) + } - private fun findCourseItemByViewType( - publicCourseId: Int, - course: DiscoverMultiViewItem, - updatedCourse: EditableDiscoverCourse - ): Boolean { - when (course) { - is MarathonCourse -> { - if (course.id == publicCourseId) { - updateMarathonCourseItem(course, updatedCourse) - return true + is RecommendCourse -> {} } - } - is RecommendCourse -> { - if (course.id == publicCourseId) { - updateRecommendCourseItem(course, updatedCourse) - return true - } + return } } - - return false - } - - private fun updateMarathonCourseItem( - course: MarathonCourse, - updatedCourse: EditableDiscoverCourse - ) { - course.title = updatedCourse.title - course.scrap = updatedCourse.scrap - notifyItemChanged(MultiViewType.MARATHON.ordinal) - } - - private fun updateRecommendCourseItem( - course: RecommendCourse, - updatedCourse: EditableDiscoverCourse - ) { - course.title = updatedCourse.title - course.scrap = updatedCourse.scrap - notifyItemChanged(MultiViewType.RECOMMEND.ordinal) } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index fbc945cde..1cc554259 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -7,29 +7,35 @@ import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse +import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration +import timber.log.Timber sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) { + class MarathonCourseViewHolder( private val binding: ItemDiscoverMultiviewMarathonBinding, - private val onHeartButtonClick: (Int, Boolean) -> Unit, - private val onCourseItemClick: (Int) -> Unit, - private val handleVisitorMode: () -> Unit + onHeartButtonClick: (Int, Boolean) -> Unit, + onCourseItemClick: (Int) -> Unit, + handleVisitorMode: () -> Unit ) : DiscoverMultiViewHolder(binding) { + private var marathonCourses = listOf() + private val marathonAdapter by lazy { + DiscoverMarathonAdapter( + onHeartButtonClick, onCourseItemClick, handleVisitorMode + ) + } + fun bind(marathonCourses: List) { + this.marathonCourses = marathonCourses + binding.rvDiscoverMarathon.apply { setHasFixedSize(true) - - adapter = DiscoverMarathonAdapter( - onHeartButtonClick, - onCourseItemClick, - handleVisitorMode - ).apply { + adapter = marathonAdapter.apply { submitList(marathonCourses) } - addItemDecoration( DiscoverMarathonItemDecoration( context = context, @@ -39,6 +45,20 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : ) } } + + fun updateMarathonCourseItem( + publicCourseId: Int, + updatedCourse: EditableDiscoverCourse + ) { + marathonCourses.forEachIndexed { index, course -> + if (course.id == publicCourseId) { + course.title = updatedCourse.title + course.scrap = updatedCourse.scrap + marathonAdapter.notifyItemChanged(index) + return@forEachIndexed + } + } + } } class RecommendCourseViewHolder( From 403d45e4d21991c92d86ddd23b4e0e57b140842e Mon Sep 17 00:00:00 2001 From: leeeha Date: Fri, 15 Dec 2023 02:50:00 +0900 Subject: [PATCH 04/61] =?UTF-8?q?[ADD]=20#264=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=EB=A7=8C=20=EA=B0=B1=EC=8B=A0=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverFragment.kt | 5 +- .../adapter/DiscoverMultiViewAdapter.kt | 9 ++-- .../adapter/DiscoverMultiViewHolder.kt | 49 +++++++++++++++---- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 15ddbc098..22e232d4e 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -55,11 +55,10 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { - val updatedCourse: EditableDiscoverCourse = - result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE) + val updatedCourse: EditableDiscoverCourse = result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE) ?: return@registerForActivityResult - // todo: 상세페이지 갔다가 이전으로 돌아오면 제목, 스크랩 변경사항이 바로 표시되도록 + // 상세페이지 갔다가 이전으로 돌아오면 제목, 스크랩 변경사항이 바로 표시되도록 multiViewAdapter.updateCourseItem( publicCourseId = viewModel.clickedCourseId, updatedCourse = updatedCourse diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 44b26ce66..2c6ea34b5 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -23,6 +23,7 @@ class DiscoverMultiViewAdapter( } private lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder + private lateinit var recommendViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder override fun getItemViewType(position: Int): Int { return when (multiViewItems[position].first()) { @@ -73,6 +74,7 @@ class DiscoverMultiViewAdapter( } is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { + recommendViewHolder = holder (multiViewItems[position] as? List)?.let { holder.bind(it) } @@ -88,13 +90,14 @@ class DiscoverMultiViewAdapter( for (course in courses) { when (course) { is MarathonCourse -> { - // todo: 마라톤 코스 뷰 홀더에서 어댑터 아이템 갱신하는 코드 실행 + // 마라톤 코스 뷰 홀더에서 어댑터 아이템 갱신하는 코드 실행 marathonViewHolder.updateMarathonCourseItem(publicCourseId, updatedCourse) } - is RecommendCourse -> {} + is RecommendCourse -> { + recommendViewHolder.updateRecommendCourseItem(publicCourseId, updatedCourse) + } } - return } } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 1cc554259..9fac6d8a0 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -30,12 +30,17 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : fun bind(marathonCourses: List) { this.marathonCourses = marathonCourses + initMarathonRecyclerView() + } + private fun initMarathonRecyclerView() { binding.rvDiscoverMarathon.apply { setHasFixedSize(true) + adapter = marathonAdapter.apply { submitList(marathonCourses) } + addItemDecoration( DiscoverMarathonItemDecoration( context = context, @@ -55,6 +60,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : course.title = updatedCourse.title course.scrap = updatedCourse.scrap marathonAdapter.notifyItemChanged(index) + Timber.e("marathon: notifyItemChanged") return@forEachIndexed } } @@ -63,23 +69,31 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : class RecommendCourseViewHolder( private val binding: ItemDiscoverMultiviewRecommendBinding, - private val onHeartButtonClick: (Int, Boolean) -> Unit, - private val onCourseItemClick: (Int) -> Unit, - private val handleVisitorMode: () -> Unit, + onHeartButtonClick: (Int, Boolean) -> Unit, + onCourseItemClick: (Int) -> Unit, + handleVisitorMode: () -> Unit, ) : DiscoverMultiViewHolder(binding) { + private var recommendCourses = listOf() + private val recommendAdapter by lazy { + DiscoverRecommendAdapter( + onHeartButtonClick, + onCourseItemClick, + handleVisitorMode + ) + } + fun bind(recommendCourses: List) { + this.recommendCourses = recommendCourses + initRecommendRecyclerView() + } + + private fun initRecommendRecyclerView() { binding.rvDiscoverRecommend.apply { setHasFixedSize(true) layoutManager = GridLayoutManager(context, 2) - - adapter = DiscoverRecommendAdapter( - onHeartButtonClick, - onCourseItemClick, - handleVisitorMode - ).apply { + adapter = recommendAdapter.apply { submitList(recommendCourses) } - addItemDecoration( DiscoverRecommendItemDecoration( context = context, @@ -91,6 +105,21 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } + fun updateRecommendCourseItem( + publicCourseId: Int, + updatedCourse: EditableDiscoverCourse + ) { + recommendCourses.forEachIndexed { index, course -> + if (course.id == publicCourseId) { + course.title = updatedCourse.title + course.scrap = updatedCourse.scrap + recommendAdapter.notifyItemChanged(index) + Timber.e("recommend: notifyItemChanged") + return@forEachIndexed + } + } + } + private fun initScrollListener(currentPageNumber: Int, recyclerView: RecyclerView) { recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { From 9990d5c11b6de07b7f1e943aa9037fe1a6501a6d Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 15:12:41 +0900 Subject: [PATCH 05/61] =?UTF-8?q?[MOD]=20#264=20=ED=98=84=EC=9E=AC=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EC=95=84=EC=9D=B4=ED=85=9C=EC=9D=98=20?= =?UTF-8?q?=EB=B7=B0=20=ED=83=80=EC=9E=85=EC=9D=84=20=EA=B5=AC=EB=B6=84?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/DiscoverMultiViewAdapter.kt | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 2c6ea34b5..9f8add1dd 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -63,7 +63,6 @@ class DiscoverMultiViewAdapter( } } } - override fun onBindViewHolder(holder: DiscoverMultiViewHolder, position: Int) { when (holder) { is DiscoverMultiViewHolder.MarathonCourseViewHolder -> { @@ -86,19 +85,21 @@ class DiscoverMultiViewAdapter( publicCourseId: Int, updatedCourse: EditableDiscoverCourse ) { - for (courses in multiViewItems) { - for (course in courses) { - when (course) { - is MarathonCourse -> { - // 마라톤 코스 뷰 홀더에서 어댑터 아이템 갱신하는 코드 실행 - marathonViewHolder.updateMarathonCourseItem(publicCourseId, updatedCourse) - } + for (items in multiViewItems) { + when (items.first()) { + is MarathonCourse -> { + marathonViewHolder.updateMarathonCourseItem( + publicCourseId = publicCourseId, + updatedCourse = updatedCourse + ) + } - is RecommendCourse -> { - recommendViewHolder.updateRecommendCourseItem(publicCourseId, updatedCourse) - } + else -> { + recommendViewHolder.updateRecommendCourseItem( + publicCourseId = publicCourseId, + updatedCourse = updatedCourse + ) } - return } } } From b747e433d69507a1d54ac127f2a12749edc9c9b9 Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 15:13:03 +0900 Subject: [PATCH 06/61] =?UTF-8?q?[DEL]=20#264=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/adapter/DiscoverMultiViewHolder.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 9fac6d8a0..d29f3e423 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -36,11 +36,9 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : private fun initMarathonRecyclerView() { binding.rvDiscoverMarathon.apply { setHasFixedSize(true) - adapter = marathonAdapter.apply { submitList(marathonCourses) } - addItemDecoration( DiscoverMarathonItemDecoration( context = context, @@ -60,7 +58,6 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : course.title = updatedCourse.title course.scrap = updatedCourse.scrap marathonAdapter.notifyItemChanged(index) - Timber.e("marathon: notifyItemChanged") return@forEachIndexed } } @@ -114,7 +111,6 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : course.title = updatedCourse.title course.scrap = updatedCourse.scrap recommendAdapter.notifyItemChanged(index) - Timber.e("recommend: notifyItemChanged") return@forEachIndexed } } From daaca86f7fd682262590a414ffecc791a3030a70 Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 15:13:12 +0900 Subject: [PATCH 07/61] =?UTF-8?q?[DEL]=20#264=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt index 5e67ac90d..2677e0e74 100644 --- a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt +++ b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt @@ -30,7 +30,6 @@ class DiscoverRecommendItemDecoration( outRect.bottom = bottomSpacingPx } - // 마지막 열인지 검사하기 private fun isLastColumn(view: View, parent: RecyclerView): Boolean { val currentItemPosition = parent.getChildAdapterPosition(view) return currentItemPosition % spanCount == spanCount - 1 From 387505281964d3a44791d8ea03c77ab2f2a46900 Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 15:15:21 +0900 Subject: [PATCH 08/61] =?UTF-8?q?[MOD]=20#264=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 5d268c19b..d092b91c7 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -54,11 +54,10 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + // 상세페이지 갔다가 이전으로 돌아오면 아이템 변경사항이 바로 반영되도록 (제목, 스크랩) if (result.resultCode == Activity.RESULT_OK) { val updatedCourse: EditableDiscoverCourse = result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE) ?: return@registerForActivityResult - - // 상세페이지 갔다가 이전으로 돌아오면 제목, 스크랩 변경사항이 바로 표시되도록 multiViewAdapter.updateCourseItem( publicCourseId = viewModel.clickedCourseId, updatedCourse = updatedCourse From 156e0b493625ac225e41ac53fba01418085292dd Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 15:35:58 +0900 Subject: [PATCH 09/61] =?UTF-8?q?[CHORE]=20#264=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=88=98=EC=A0=95=ED=96=88=EB=8B=A4=EA=B0=80=20?= =?UTF-8?q?=EB=90=98=EB=8F=8C=EB=A6=AC=EB=8A=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/CourseDetailActivity.kt | 23 ++++++++----------- .../detail/CourseDetailViewModel.kt | 18 +++++++-------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt index e94112524..02b81713e 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt @@ -334,7 +334,7 @@ class CourseDetailActivity : onNegativeButtonClicked = {}, onPositiveButtonClicked = { // 편집 모드 -> 뒤로가기 버튼 -> 편집 중단 확인 -> 뷰에 원래 제목으로 보여줌. - viewModel.restoreOriginalContents() + viewModel.restoreOriginalCourseDetail() enterReadMode() } ) @@ -396,7 +396,7 @@ class CourseDetailActivity : private fun enterEditMode() { viewModel.apply { updateCurrentScreenMode(EditMode) - saveCurrentContents() + saveCurrentCourseDetail() } updateLayoutForEditMode() } @@ -448,7 +448,10 @@ class CourseDetailActivity : courseDetail = state.data ?: return@observe binding.courseDetail = courseDetail - viewModel.updateCourseDetailContents(courseDetail.toCourseDetailContents()) + val editableCourseDetail = + EditableCourseDetail(courseDetail.title, courseDetail.description) + viewModel.updateCourseDetailEditText(editableCourseDetail) + updateUserProfileStamp() updateUserLevel() updateScrapState() @@ -466,14 +469,6 @@ class CourseDetailActivity : } } - private fun T.toCourseDetailContents(): EditableCourseDetail? { - return when (this) { - is CourseDetail -> EditableCourseDetail(title, description) - is EditableCourseDetail -> EditableCourseDetail(title, description) - else -> null - } - } - private fun initDepartureLatLng() { departureLatLng = LatLng(courseDetail.path[0][0], courseDetail.path[0][1]) } @@ -494,8 +489,8 @@ class CourseDetailActivity : binding.indeterminateBar.isVisible = false state.data?.let { response -> - viewModel.updateCourseDetailContents(response.toCourseDetailContents()) - updateTextView(response) + viewModel.updateCourseDetailEditText(response) + updateCourseDetailTextView(response) } enterReadMode() @@ -512,7 +507,7 @@ class CourseDetailActivity : } } - private fun updateTextView(courseDetail: EditableCourseDetail) { + private fun updateCourseDetailTextView(courseDetail: EditableCourseDetail) { binding.apply { tvCourseDetailTitle.text = courseDetail.title tvCourseDetailDesc.text = courseDetail.description diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailViewModel.kt index 2ff85fe22..400a5ca05 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailViewModel.kt @@ -58,21 +58,19 @@ class CourseDetailViewModel @Inject constructor( private var _currentScreenMode: ScreenMode = ScreenMode.ReadOnlyMode val currentScreenMode get() = _currentScreenMode - private var savedCourseDetailContents = EditableCourseDetail("", "") + private var savedCourseDetail = EditableCourseDetail("", "") - fun updateCourseDetailContents(courseDetail: EditableCourseDetail?) { - courseDetail?.let { - _title.value = courseDetail.title - _description.value = courseDetail.description - } + fun updateCourseDetailEditText(course: EditableCourseDetail) { + _title.value = course.title + _description.value = course.description } - fun saveCurrentContents() { - savedCourseDetailContents = EditableCourseDetail(title, description) + fun saveCurrentCourseDetail() { + savedCourseDetail = EditableCourseDetail(title, description) } - fun restoreOriginalContents() { - updateCourseDetailContents(savedCourseDetailContents) + fun restoreOriginalCourseDetail() { + updateCourseDetailEditText(savedCourseDetail) } fun updateCurrentScreenMode(mode: ScreenMode) { From 91e8f75a97732f7e334b2ab88a2d718bbf214547 Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 15:40:14 +0900 Subject: [PATCH 10/61] =?UTF-8?q?[FIX]=20#264=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80=EC=9D=98=20path?= =?UTF-8?q?=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=EA=B0=80=20=EB=B9=84=EC=96=B4?= =?UTF-8?q?=EC=9E=88=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20get=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/presentation/detail/CourseDetailActivity.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt index 02b81713e..4c2121300 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt @@ -470,7 +470,10 @@ class CourseDetailActivity : } private fun initDepartureLatLng() { - departureLatLng = LatLng(courseDetail.path[0][0], courseDetail.path[0][1]) + Timber.e("${courseDetail.path}") + if (courseDetail.path.isNotEmpty()) { + departureLatLng = LatLng(courseDetail.path[0][0], courseDetail.path[0][1]) + } } private fun initConnectedSpots() { From ddbf82efafb3d815a2482d03d515c7002a4eb83d Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 15:50:20 +0900 Subject: [PATCH 11/61] =?UTF-8?q?[CHORE]=20#264=20result=20launcher=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=A3=BC=EC=84=9D=20=EC=9C=84=EC=B9=98=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 --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index d092b91c7..93fc853f2 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -54,8 +54,8 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private val resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - // 상세페이지 갔다가 이전으로 돌아오면 아이템 변경사항이 바로 반영되도록 (제목, 스크랩) if (result.resultCode == Activity.RESULT_OK) { + // 상세페이지 갔다가 이전으로 돌아오면 아이템 변경사항이 바로 반영되도록 (제목, 스크랩) val updatedCourse: EditableDiscoverCourse = result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE) ?: return@registerForActivityResult multiViewAdapter.updateCourseItem( From 1aad6aff35b3e09085c6e9d60508ff2fe91247ad Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 16:21:15 +0900 Subject: [PATCH 12/61] =?UTF-8?q?[DEL]=20#264=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/presentation/discover/DiscoverFragment.kt | 4 ++-- .../discover/adapter/DiscoverMarathonAdapter.kt | 11 ----------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 93fc853f2..7474c11d1 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -341,11 +341,11 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun navigateToDetailScreen(publicCourseId: Int) { val context = context ?: return - val intent = Intent(context, CourseDetailActivity::class.java).apply { + Intent(context, CourseDetailActivity::class.java).apply { putExtra(EXTRA_PUBLIC_COURSE_ID, publicCourseId) putExtra(EXTRA_ROOT_SCREEN, CourseDetailRootScreen.COURSE_DISCOVER) + resultLauncher.launch(this) } - resultLauncher.launch(intent) activity?.applyScreenEnterAnimation() } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt index 661d0ad56..4954ff72f 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt @@ -19,17 +19,6 @@ class DiscoverMarathonAdapter( ) : ListAdapter(diffUtil) { - fun updateCourseItem(publicCourseId: Int, updatedCourse: EditableDiscoverCourse) { - currentList.forEachIndexed { index, course -> - if (course.id == publicCourseId) { - course.title = updatedCourse.title - course.scrap = updatedCourse.scrap - notifyItemChanged(index) - return@forEachIndexed - } - } - } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMarathonViewHolder { return DiscoverMarathonViewHolder( ItemDiscoverMarathonBinding.inflate( From 539e16c97e880e219d2804293b64441cfd353b1c Mon Sep 17 00:00:00 2001 From: leeeha Date: Sun, 17 Dec 2023 16:21:15 +0900 Subject: [PATCH 13/61] =?UTF-8?q?[DEL]=20#264=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=BD=94=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverFragment.kt | 4 ++-- .../discover/adapter/DiscoverMarathonAdapter.kt | 12 ------------ 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 93fc853f2..7474c11d1 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -341,11 +341,11 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun navigateToDetailScreen(publicCourseId: Int) { val context = context ?: return - val intent = Intent(context, CourseDetailActivity::class.java).apply { + Intent(context, CourseDetailActivity::class.java).apply { putExtra(EXTRA_PUBLIC_COURSE_ID, publicCourseId) putExtra(EXTRA_ROOT_SCREEN, CourseDetailRootScreen.COURSE_DISCOVER) + resultLauncher.launch(this) } - resultLauncher.launch(intent) activity?.applyScreenEnterAnimation() } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt index 661d0ad56..9594f9634 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMarathonAdapter.kt @@ -9,7 +9,6 @@ import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMarathonBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.presentation.MainActivity -import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.callback.diff.ItemDiffCallback class DiscoverMarathonAdapter( @@ -19,17 +18,6 @@ class DiscoverMarathonAdapter( ) : ListAdapter(diffUtil) { - fun updateCourseItem(publicCourseId: Int, updatedCourse: EditableDiscoverCourse) { - currentList.forEachIndexed { index, course -> - if (course.id == publicCourseId) { - course.title = updatedCourse.title - course.scrap = updatedCourse.scrap - notifyItemChanged(index) - return@forEachIndexed - } - } - } - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMarathonViewHolder { return DiscoverMarathonViewHolder( ItemDiscoverMarathonBinding.inflate( From c156a93ee45d474b5c4eda3092581c3230cf4425 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 18 Dec 2023 16:19:17 +0900 Subject: [PATCH 14/61] =?UTF-8?q?[REFACTOR]=20#264=20sealed=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=9E=90=EC=8B=9D=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=97=90=EC=84=9C=20=EA=B3=B5=ED=86=B5=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=EC=9D=84=20=EC=98=A4=EB=B2=84=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=93=9C=20=ED=95=98=EC=97=AC=20=ED=83=80=EA=B2=9F=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=EC=9D=84=20=EC=B0=BE=EB=8A=94=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B0=84=EA=B2=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/DiscoverMultiViewItem.kt | 12 ++++--- .../adapter/DiscoverMultiViewAdapter.kt | 31 ++++++++++--------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt index 26279c775..9e1c9600c 100644 --- a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt +++ b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt @@ -1,21 +1,23 @@ package com.runnect.runnect.domain.entity -sealed class DiscoverMultiViewItem { +sealed class DiscoverMultiViewItem( + open val id: Int +) { data class MarathonCourse( - val id: Int, + override val id: Int, val courseId: Int, var title: String, val image: String, var scrap: Boolean, val departure: String, - ) : DiscoverMultiViewItem() + ) : DiscoverMultiViewItem(id) data class RecommendCourse( - val id: Int, + override val id: Int, val courseId: Int, var title: String, val image: String, var scrap: Boolean, val departure: String, - ) : DiscoverMultiViewItem() + ) : DiscoverMultiViewItem(id) } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 9f8add1dd..934a85e00 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -9,7 +9,6 @@ import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse -import timber.log.Timber class DiscoverMultiViewAdapter( private val multiViewItems: List>, @@ -85,21 +84,23 @@ class DiscoverMultiViewAdapter( publicCourseId: Int, updatedCourse: EditableDiscoverCourse ) { - for (items in multiViewItems) { - when (items.first()) { - is MarathonCourse -> { - marathonViewHolder.updateMarathonCourseItem( - publicCourseId = publicCourseId, - updatedCourse = updatedCourse - ) - } + val targetItem = multiViewItems.flatten().find { item -> + item.id == publicCourseId + } ?: return - else -> { - recommendViewHolder.updateRecommendCourseItem( - publicCourseId = publicCourseId, - updatedCourse = updatedCourse - ) - } + when (targetItem) { + is MarathonCourse -> { + marathonViewHolder.updateMarathonCourseItem( + publicCourseId = publicCourseId, + updatedCourse = updatedCourse + ) + } + + else -> { + recommendViewHolder.updateRecommendCourseItem( + publicCourseId = publicCourseId, + updatedCourse = updatedCourse + ) } } } From 2a24df91c350c86e705541c2dcc2f26b7bb6dc38 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 18 Dec 2023 16:29:23 +0900 Subject: [PATCH 15/61] =?UTF-8?q?[MOD]=20#297=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EC=9D=91=EB=8B=B5=20dto=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 --- .../runnect/data/dto/response/ResponseGetDiscoverRecommend.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt b/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt index 5dae9a8df..b2329ee92 100644 --- a/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt +++ b/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt @@ -8,6 +8,10 @@ import kotlinx.serialization.Serializable data class ResponseGetDiscoverRecommend( @SerialName("ordering") val ordering: String, + @SerialName("totalPageSize") + val totalPageSize: Int, + @SerialName("isEnd") + val isEnd: Boolean, @SerialName("publicCourses") val publicCourses: List ) { From 53421d0a166c91dad35f99e8475f96838b256157 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 18 Dec 2023 16:31:01 +0900 Subject: [PATCH 16/61] =?UTF-8?q?[ADD]=20#297=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EB=A0=88=EC=9D=B4=EC=96=B4=EC=9D=98=20=EC=B6=94?= =?UTF-8?q?=EC=B2=9C=20=EC=BD=94=EC=8A=A4=20dto=EC=97=90=20isEnd=20?= =?UTF-8?q?=EC=86=8D=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/data/dto/response/ResponseGetDiscoverRecommend.kt | 3 ++- .../com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt b/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt index b2329ee92..7e0783dfe 100644 --- a/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt +++ b/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt @@ -46,7 +46,8 @@ data class ResponseGetDiscoverRecommend( title = course.title, image = course.image, scrap = course.scrap, - departure = "${course.departure.region} ${course.departure.city}" + departure = "${course.departure.region} ${course.departure.city}", + isEnd = isEnd ) } } diff --git a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt index 9e1c9600c..fce300af0 100644 --- a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt +++ b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt @@ -19,5 +19,6 @@ sealed class DiscoverMultiViewItem( val image: String, var scrap: Boolean, val departure: String, + val isEnd: Boolean ) : DiscoverMultiViewItem(id) } \ No newline at end of file From c3d7c7429c4258a8a0ab7306c1335d45e8b35681 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 18 Dec 2023 17:08:03 +0900 Subject: [PATCH 17/61] =?UTF-8?q?[FEAT]=20#297=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EB=AA=A9=EB=A1=9D=EC=9D=B4=20=EB=A7=88?= =?UTF-8?q?=EC=A7=80=EB=A7=89=20=ED=8E=98=EC=9D=B4=EC=A7=80=EC=97=90=20?= =?UTF-8?q?=EB=8F=84=EB=8B=AC=ED=96=88=EB=8A=94=EC=A7=80=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=ED=95=98=EB=8A=94=20=EC=86=8D=EC=84=B1=EC=9D=84=20?= =?UTF-8?q?=EB=B7=B0=EB=AA=A8=EB=8D=B8=EC=97=90=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/ResponseGetDiscoverRecommend.kt | 3 +- .../data/repository/CourseRepositoryImpl.kt | 9 ++-- .../domain/entity/DiscoverMultiViewItem.kt | 1 - .../entity/RecommendCoursePagingData.kt | 6 +++ .../domain/repository/CourseRepository.kt | 3 +- .../discover/DiscoverViewModel.kt | 44 +++++++++---------- 6 files changed, 36 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt diff --git a/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt b/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt index 7e0783dfe..b2329ee92 100644 --- a/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt +++ b/app/src/main/java/com/runnect/runnect/data/dto/response/ResponseGetDiscoverRecommend.kt @@ -46,8 +46,7 @@ data class ResponseGetDiscoverRecommend( title = course.title, image = course.image, scrap = course.scrap, - departure = "${course.departure.region} ${course.departure.city}", - isEnd = isEnd + departure = "${course.departure.region} ${course.departure.city}" ) } } diff --git a/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt b/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt index a36e72059..a8509ff51 100644 --- a/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt +++ b/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt @@ -17,6 +17,7 @@ import com.runnect.runnect.domain.repository.CourseRepository import com.runnect.runnect.domain.entity.DiscoverSearchCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.domain.entity.EditableCourseDetail +import com.runnect.runnect.domain.entity.RecommendCoursePagingData import com.runnect.runnect.util.extension.toData import okhttp3.MultipartBody import okhttp3.RequestBody @@ -32,11 +33,13 @@ class CourseRepositoryImpl @Inject constructor(private val remoteCourseDataSourc override suspend fun getRecommendCourse( pageNo: String, ordering: String - ): Result?> = runCatching { - remoteCourseDataSource.getRecommendCourse( + ): Result = runCatching { + val response = remoteCourseDataSource.getRecommendCourse( pageNo = pageNo, ordering = ordering - ).data?.toRecommendCourses() + ).data + + RecommendCoursePagingData(response?.isEnd, response?.toRecommendCourses()) } override suspend fun getCourseSearch(keyword: String): Result?> = diff --git a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt index fce300af0..9e1c9600c 100644 --- a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt +++ b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt @@ -19,6 +19,5 @@ sealed class DiscoverMultiViewItem( val image: String, var scrap: Boolean, val departure: String, - val isEnd: Boolean ) : DiscoverMultiViewItem(id) } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt b/app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt new file mode 100644 index 000000000..33a51ce22 --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt @@ -0,0 +1,6 @@ +package com.runnect.runnect.domain.entity + +data class RecommendCoursePagingData( + val isEnd: Boolean?, + val recommendCourses: List? +) diff --git a/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt b/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt index 5e6b8ce63..9cba95d52 100644 --- a/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt +++ b/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt @@ -14,6 +14,7 @@ import com.runnect.runnect.data.dto.response.ResponsePutMyDrawCourse import com.runnect.runnect.domain.entity.CourseDetail import com.runnect.runnect.domain.entity.DiscoverSearchCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* +import com.runnect.runnect.domain.entity.RecommendCoursePagingData import com.runnect.runnect.domain.entity.EditableCourseDetail import okhttp3.MultipartBody import okhttp3.RequestBody @@ -22,7 +23,7 @@ import retrofit2.Response interface CourseRepository { suspend fun getMarathonCourse(): Result?> - suspend fun getRecommendCourse(pageNo: String, ordering: String): Result?> + suspend fun getRecommendCourse(pageNo: String, ordering: String): Result suspend fun getCourseSearch(keyword: String): Result?> diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index 2af1dda79..979da9f0a 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -8,6 +8,7 @@ import com.runnect.runnect.data.dto.request.RequestPostCourseScrap import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.domain.entity.DiscoverBanner +import com.runnect.runnect.domain.entity.RecommendCoursePagingData import com.runnect.runnect.domain.repository.BannerRepository import com.runnect.runnect.domain.repository.CourseRepository import com.runnect.runnect.presentation.state.UiStateV2 @@ -30,8 +31,8 @@ class DiscoverViewModel @Inject constructor( val marathonCourseState: LiveData?>> get() = _marathonCourseState - private val _recommendCourseState = MutableLiveData?>>() - val recommendCourseState: LiveData?>> + private val _recommendCourseState = MutableLiveData>() + val recommendCourseState: LiveData> get() = _recommendCourseState private val _courseScrapState = MutableLiveData>() @@ -41,11 +42,14 @@ class DiscoverViewModel @Inject constructor( private val _multiViewItems: ArrayList> = arrayListOf() val multiViewItems: List> get() = _multiViewItems + private var _clickedCourseId = -1 + val clickedCourseId get() = _clickedCourseId + private var _currentPageNumber = 1 val currentPageNumber get() = _currentPageNumber - private var _clickedCourseId = -1 - val clickedCourseId get() = _clickedCourseId + private var _isRecommendCoursePageEnd = false + val isRecommendCoursePageEnd get() = _isRecommendCoursePageEnd init { getDiscoverBanners() @@ -91,16 +95,11 @@ class DiscoverViewModel @Inject constructor( courseRepository.getMarathonCourse() .onSuccess { courses -> - if (courses == null) { - _marathonCourseState.value = - UiStateV2.Failure("MARATHON COURSE DATA IS NULL") - Timber.e("MARATHON COURSE DATA IS NULL") - return@launch + courses?.let { + _multiViewItems.add(it) + _marathonCourseState.value = UiStateV2.Success(it) + Timber.e("MARATHON COURSE GET SUCCESS") } - - _multiViewItems.add(courses) - _marathonCourseState.value = UiStateV2.Success(courses) - Timber.e("MARATHON COURSE GET SUCCESS") } .onFailure { exception -> _marathonCourseState.value = UiStateV2.Failure(exception.message.toString()) @@ -114,18 +113,17 @@ class DiscoverViewModel @Inject constructor( _recommendCourseState.value = UiStateV2.Loading courseRepository.getRecommendCourse(pageNo = pageNo.toString(), ordering = ordering) - .onSuccess { courses -> - if (courses == null) { - _recommendCourseState.value = - UiStateV2.Failure("RECOMMEND COURSE DATA IS NULL") - Timber.e("RECOMMEND COURSE DATA IS NULL") - return@launch + .onSuccess { pagingData -> + pagingData.isEnd?.let { + _isRecommendCoursePageEnd = it } - _multiViewItems.add(courses) - _recommendCourseState.value = UiStateV2.Success(courses) - Timber.e("RECOMMEND COURSE GET SUCCESS") - Timber.e("ITEM SIZE: ${multiViewItems.size}") + pagingData.recommendCourses?.let { + _multiViewItems.add(it) + _recommendCourseState.value = UiStateV2.Success(pagingData) + Timber.e("RECOMMEND COURSE GET SUCCESS") + Timber.e("ITEM SIZE: ${multiViewItems.size}") + } }.onFailure { exception -> _recommendCourseState.value = UiStateV2.Failure(exception.message.toString()) Timber.e("RECOMMEND COURSE GET FAIL") From b65e131bae2aa362b7e7140e8db8960b903ddb43 Mon Sep 17 00:00:00 2001 From: leeeha Date: Mon, 18 Dec 2023 17:13:19 +0900 Subject: [PATCH 18/61] =?UTF-8?q?[FEAT]=20#297=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EB=B7=B0=ED=99=80=EB=8D=94=EC=97=90?= =?UTF-8?q?=EA=B2=8C=20=EB=84=98=EA=B8=B0=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 1 + .../presentation/discover/adapter/DiscoverMultiViewAdapter.kt | 4 +++- .../presentation/discover/adapter/DiscoverMultiViewHolder.kt | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 7474c11d1..7522b5f33 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -319,6 +319,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun initMultiViewAdapter() { multiViewAdapter = DiscoverMultiViewAdapter( multiViewItems = viewModel.multiViewItems, + isRecommendCoursePageEnd = viewModel.isRecommendCoursePageEnd, onHeartButtonClick = { courseId, scrap -> viewModel.postCourseScrap(courseId, scrap) }, diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 934a85e00..aeb48ac63 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -12,6 +12,7 @@ import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse class DiscoverMultiViewAdapter( private val multiViewItems: List>, + private val isRecommendCoursePageEnd: Boolean, private val onHeartButtonClick: (Int, Boolean) -> Unit, private val onCourseItemClick: (Int) -> Unit, private val handleVisitorMode: () -> Unit, @@ -57,7 +58,8 @@ class DiscoverMultiViewAdapter( ), onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, - handleVisitorMode = handleVisitorMode + handleVisitorMode = handleVisitorMode, + isPageEnd = isRecommendCoursePageEnd ) } } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index d29f3e423..2268702b1 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -66,6 +66,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : class RecommendCourseViewHolder( private val binding: ItemDiscoverMultiviewRecommendBinding, + private val isPageEnd: Boolean, onHeartButtonClick: (Int, Boolean) -> Unit, onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit, @@ -121,6 +122,9 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) // TODO: 스크롤이 최하단까지 내려간 경우, 다음 페이지 요청하기 (다음 페이지가 있는 경우에만) + if (!isPageEnd) { + + } } }) } From 14dbc2a209a8a7cdce6aaff164e65d0bd0528f2f Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 16:33:42 +0900 Subject: [PATCH 19/61] =?UTF-8?q?[FEAT]=20#297=20=EB=82=B4=EB=B6=80=20?= =?UTF-8?q?=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC=EB=B7=B0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20findLastCompletelyVisibleItemPosition=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=ED=98=B8=EC=B6=9C=ED=95=98=EB=8A=94=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverFragment.kt | 22 ++++++- .../discover/DiscoverViewModel.kt | 57 +++++++++++++------ .../adapter/DiscoverMultiViewAdapter.kt | 8 ++- .../adapter/DiscoverMultiViewHolder.kt | 42 ++++++++++---- 4 files changed, 96 insertions(+), 33 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 7522b5f33..d6500b770 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -213,6 +213,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm setupBannerGetStateObserver() setupMarathonCourseGetStateObserver() setupRecommendCourseGetStateObserver() + setupRecommendCourseNextPageStateObserver() setupCourseScrapStateObserver() } @@ -319,7 +320,9 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun initMultiViewAdapter() { multiViewAdapter = DiscoverMultiViewAdapter( multiViewItems = viewModel.multiViewItems, - isRecommendCoursePageEnd = viewModel.isRecommendCoursePageEnd, + onNextPageLoad = { + viewModel.getRecommendCourseNextPage() + }, onHeartButtonClick = { courseId, scrap -> viewModel.postCourseScrap(courseId, scrap) }, @@ -357,6 +360,23 @@ class DiscoverFragment : BindingFragment(R.layout.fragm ).show() } + private fun setupRecommendCourseNextPageStateObserver() { + viewModel.nextPageState.observe(viewLifecycleOwner) { state -> + when (state) { + is UiStateV2.Success -> { + val recommendCourses = state.data + multiViewAdapter.updateRecommendCourses(recommendCourses) + } + + is UiStateV2.Failure -> { + context?.showSnackbar(binding.root, state.msg) + } + + else -> {} + } + } + } + private fun setupCourseScrapStateObserver() { viewModel.courseScrapState.observe(viewLifecycleOwner) { state -> if (state is UiStateV2.Failure) { diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index 979da9f0a..03739fe8d 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -31,10 +31,14 @@ class DiscoverViewModel @Inject constructor( val marathonCourseState: LiveData?>> get() = _marathonCourseState - private val _recommendCourseState = MutableLiveData>() - val recommendCourseState: LiveData> + private val _recommendCourseState = MutableLiveData>>() + val recommendCourseState: LiveData>> get() = _recommendCourseState + private val _nextPageState = MutableLiveData>>() + val nextPageState: LiveData>> + get() = _nextPageState + private val _courseScrapState = MutableLiveData>() val courseScrapState: LiveData> get() = _courseScrapState @@ -45,29 +49,22 @@ class DiscoverViewModel @Inject constructor( private var _clickedCourseId = -1 val clickedCourseId get() = _clickedCourseId - private var _currentPageNumber = 1 - val currentPageNumber get() = _currentPageNumber - - private var _isRecommendCoursePageEnd = false - val isRecommendCoursePageEnd get() = _isRecommendCoursePageEnd + private var isRecommendCoursePageEnd = false + private var currentPageNo = 1 init { getDiscoverBanners() getMarathonCourse() - getRecommendCourse(pageNo = currentPageNumber, ordering = "date") + getRecommendCourse(pageNo = 1, ordering = "date") } fun saveClickedCourseId(id: Int) { _clickedCourseId = id } - fun updateCurrentPageNumber(number: Int) { - _currentPageNumber = number - } - fun resetMultiViewItems() { _multiViewItems.clear() - _currentPageNumber = 1 + currentPageNo = 1 } fun refreshCurrentCourses() { @@ -98,7 +95,7 @@ class DiscoverViewModel @Inject constructor( courses?.let { _multiViewItems.add(it) _marathonCourseState.value = UiStateV2.Success(it) - Timber.e("MARATHON COURSE GET SUCCESS") + Timber.d("MARATHON COURSE GET SUCCESS") } } .onFailure { exception -> @@ -115,14 +112,14 @@ class DiscoverViewModel @Inject constructor( courseRepository.getRecommendCourse(pageNo = pageNo.toString(), ordering = ordering) .onSuccess { pagingData -> pagingData.isEnd?.let { - _isRecommendCoursePageEnd = it + isRecommendCoursePageEnd = it } pagingData.recommendCourses?.let { _multiViewItems.add(it) - _recommendCourseState.value = UiStateV2.Success(pagingData) - Timber.e("RECOMMEND COURSE GET SUCCESS") - Timber.e("ITEM SIZE: ${multiViewItems.size}") + _recommendCourseState.value = UiStateV2.Success(it) + Timber.d("RECOMMEND COURSE GET SUCCESS") + Timber.d("ITEM SIZE: ${multiViewItems.size}") } }.onFailure { exception -> _recommendCourseState.value = UiStateV2.Failure(exception.message.toString()) @@ -131,6 +128,30 @@ class DiscoverViewModel @Inject constructor( } } + // todo: 내부 리사이클러뷰에서 submitList + fun getRecommendCourseNextPage() { + viewModelScope.launch { + if (isRecommendCoursePageEnd) return@launch + + Timber.e("다음 페이지를 요청했어요!") + currentPageNo++ + courseRepository.getRecommendCourse( + pageNo = currentPageNo.toString(), + ordering = "date" + ) + .onSuccess { pagingData -> + pagingData.recommendCourses?.let { + _nextPageState.value = UiStateV2.Success(it) + Timber.d("RECOMMEND COURSE NEXT PAGE GET SUCCESS") + } + } + .onFailure { exception -> + _nextPageState.value = UiStateV2.Failure(exception.message.toString()) + Timber.e("RECOMMEND COURSE NEXT PAGE GET FAIL") + } + } + } + fun checkCourseLoadState(): Boolean { return marathonCourseState.value is UiStateV2.Success && recommendCourseState.value is UiStateV2.Success && diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index aeb48ac63..4ce8474a9 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -12,7 +12,7 @@ import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse class DiscoverMultiViewAdapter( private val multiViewItems: List>, - private val isRecommendCoursePageEnd: Boolean, + private val onNextPageLoad: () -> Unit, private val onHeartButtonClick: (Int, Boolean) -> Unit, private val onCourseItemClick: (Int) -> Unit, private val handleVisitorMode: () -> Unit, @@ -56,10 +56,10 @@ class DiscoverMultiViewAdapter( parent, false ), + onNextPageLoad = onNextPageLoad, onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode, - isPageEnd = isRecommendCoursePageEnd ) } } @@ -82,6 +82,10 @@ class DiscoverMultiViewAdapter( } } + fun updateRecommendCourses(courses: List) { + recommendViewHolder.updateRecommendCourses(courses) + } + fun updateCourseItem( publicCourseId: Int, updatedCourse: EditableDiscoverCourse diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 2268702b1..9f19d9a7e 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -66,7 +66,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : class RecommendCourseViewHolder( private val binding: ItemDiscoverMultiviewRecommendBinding, - private val isPageEnd: Boolean, + private val onNextPageLoad: () -> Unit, onHeartButtonClick: (Int, Boolean) -> Unit, onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit, @@ -83,6 +83,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : fun bind(recommendCourses: List) { this.recommendCourses = recommendCourses initRecommendRecyclerView() + initScrollListener() } private fun initRecommendRecyclerView() { @@ -103,6 +104,31 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } + private fun initScrollListener() { + binding.rvDiscoverRecommend.addOnScrollListener(object : + RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = recyclerView.layoutManager as GridLayoutManager + val lastItemPosition = layoutManager.findLastCompletelyVisibleItemPosition() + + if (lastItemPosition + PRE_PATCH_DISTANCE >= layoutManager.itemCount) { + Timber.e("마지막 아이템 위치: ${lastItemPosition}") + Timber.e("현재 아이템 개수: ${layoutManager.itemCount}") + Timber.e("스크롤이 끝에 도달했어요!") + + onNextPageLoad.invoke() + } + } + }) + } + + fun updateRecommendCourses(courses: List) { + Timber.e("추천 코스를 갱신했어요!") + recommendAdapter.submitList(courses) + } + fun updateRecommendCourseItem( publicCourseId: Int, updatedCourse: EditableDiscoverCourse @@ -116,17 +142,9 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } } + } - private fun initScrollListener(currentPageNumber: Int, recyclerView: RecyclerView) { - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - // TODO: 스크롤이 최하단까지 내려간 경우, 다음 페이지 요청하기 (다음 페이지가 있는 경우에만) - if (!isPageEnd) { - - } - } - }) - } + companion object { + private const val PRE_PATCH_DISTANCE = 2 } } From 40c95011e6f89f40a894e5ca198c0461548e277f Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 16:57:07 +0900 Subject: [PATCH 20/61] =?UTF-8?q?[FIX]=20#297=20=EA=B8=B0=EC=A1=B4=20?= =?UTF-8?q?=EC=B6=94=EC=B2=9C=EC=BD=94=EC=8A=A4=EB=A5=BC=20replace=20?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EA=B3=A0,=20add=20=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverViewModel.kt | 13 +++++++++---- .../discover/adapter/DiscoverCourseType.kt | 6 ++++++ .../discover/adapter/DiscoverMultiViewAdapter.kt | 11 +++-------- 3 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index 03739fe8d..e4cfb1932 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -8,9 +8,9 @@ import com.runnect.runnect.data.dto.request.RequestPostCourseScrap import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.domain.entity.DiscoverBanner -import com.runnect.runnect.domain.entity.RecommendCoursePagingData import com.runnect.runnect.domain.repository.BannerRepository import com.runnect.runnect.domain.repository.CourseRepository +import com.runnect.runnect.presentation.discover.adapter.DiscoverCourseType import com.runnect.runnect.presentation.state.UiStateV2 import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.catch @@ -128,7 +128,7 @@ class DiscoverViewModel @Inject constructor( } } - // todo: 내부 리사이클러뷰에서 submitList + // todo: 내부 리사이클러뷰에서만 submitList 해도 변경사항이 반영될까? 외부 리사이클러뷰는 notify 안해도 되는 걸까? fun getRecommendCourseNextPage() { viewModelScope.launch { if (isRecommendCoursePageEnd) return@launch @@ -140,8 +140,13 @@ class DiscoverViewModel @Inject constructor( ordering = "date" ) .onSuccess { pagingData -> - pagingData.recommendCourses?.let { - _nextPageState.value = UiStateV2.Success(it) + val recommendCourses = multiViewItems[DiscoverCourseType.RECOMMEND.ordinal] + + (recommendCourses as? List)?.let { + val nextPageCourses = pagingData.recommendCourses ?: return@onSuccess + val newCourses = it.plus(nextPageCourses) + + _nextPageState.value = UiStateV2.Success(newCourses) Timber.d("RECOMMEND COURSE NEXT PAGE GET SUCCESS") } } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt new file mode 100644 index 000000000..45fef8330 --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt @@ -0,0 +1,6 @@ +package com.runnect.runnect.presentation.discover.adapter + +enum class DiscoverCourseType { + MARATHON, + RECOMMEND +} diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 4ce8474a9..c8e276962 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -17,18 +17,13 @@ class DiscoverMultiViewAdapter( private val onCourseItemClick: (Int) -> Unit, private val handleVisitorMode: () -> Unit, ) : RecyclerView.Adapter() { - enum class MultiViewType { - MARATHON, - RECOMMEND - } - private lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder private lateinit var recommendViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder override fun getItemViewType(position: Int): Int { return when (multiViewItems[position].first()) { - is MarathonCourse -> MultiViewType.MARATHON.ordinal - is RecommendCourse -> MultiViewType.RECOMMEND.ordinal + is MarathonCourse -> DiscoverCourseType.MARATHON.ordinal + is RecommendCourse -> DiscoverCourseType.RECOMMEND.ordinal } } @@ -36,7 +31,7 @@ class DiscoverMultiViewAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMultiViewHolder { return when (viewType) { - MultiViewType.MARATHON.ordinal -> { + DiscoverCourseType.MARATHON.ordinal -> { DiscoverMultiViewHolder.MarathonCourseViewHolder( binding = ItemDiscoverMultiviewMarathonBinding.inflate( LayoutInflater.from(parent.context), From cf81bbb9dd4ac2c47c6ec8beca01c378829d1ee7 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 17:51:08 +0900 Subject: [PATCH 21/61] =?UTF-8?q?[FIX]=20#297=20=EC=99=B8=EB=B6=80=20?= =?UTF-8?q?=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC=EB=B7=B0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=8A=A4=ED=81=AC=EB=A1=A4=EC=9D=98=20=EB=81=9D?= =?UTF-8?q?=EC=9D=84=20=EA=B0=90=EC=A7=80=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 --- .../presentation/discover/DiscoverFragment.kt | 16 ++++++-- .../adapter/DiscoverMultiViewAdapter.kt | 5 ++- .../adapter/DiscoverMultiViewHolder.kt | 38 +++---------------- 3 files changed, 20 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index d6500b770..5f90f7d43 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -9,6 +9,7 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.isVisible import androidx.fragment.app.viewModels +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 @@ -22,6 +23,7 @@ import com.runnect.runnect.presentation.MainActivity.Companion.isVisitorMode import com.runnect.runnect.presentation.detail.CourseDetailActivity import com.runnect.runnect.presentation.detail.CourseDetailRootScreen import com.runnect.runnect.presentation.discover.adapter.BannerAdapter +import com.runnect.runnect.presentation.discover.adapter.DiscoverCourseType import com.runnect.runnect.presentation.discover.adapter.DiscoverMultiViewAdapter import com.runnect.runnect.presentation.discover.pick.DiscoverPickActivity import com.runnect.runnect.presentation.discover.search.DiscoverSearchActivity @@ -56,7 +58,8 @@ class DiscoverFragment : BindingFragment(R.layout.fragm registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK) { // 상세페이지 갔다가 이전으로 돌아오면 아이템 변경사항이 바로 반영되도록 (제목, 스크랩) - val updatedCourse: EditableDiscoverCourse = result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE) + val updatedCourse: EditableDiscoverCourse = + result.data?.getCompatibleParcelableExtra(EXTRA_EDITABLE_DISCOVER_COURSE) ?: return@registerForActivityResult multiViewAdapter.updateCourseItem( publicCourseId = viewModel.clickedCourseId, @@ -143,8 +146,14 @@ class DiscoverFragment : BindingFragment(R.layout.fragm binding.rvDiscoverMultiView.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) + val isScrollDown = dy > 0 if (isScrollDown) showCircleUploadButton() + + if (!recyclerView.canScrollVertically(1)) { + Timber.e("스크롤이 끝에 도달했어요!") + viewModel.getRecommendCourseNextPage() + } } }) } @@ -320,9 +329,6 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun initMultiViewAdapter() { multiViewAdapter = DiscoverMultiViewAdapter( multiViewItems = viewModel.multiViewItems, - onNextPageLoad = { - viewModel.getRecommendCourseNextPage() - }, onHeartButtonClick = { courseId, scrap -> viewModel.postCourseScrap(courseId, scrap) }, @@ -433,6 +439,8 @@ class DiscoverFragment : BindingFragment(R.layout.fragm companion object { private const val BANNER_SCROLL_DELAY_TIME = 5000L private const val CENTER_POS_OF_INFINITE_BANNERS = Int.MAX_VALUE / 2 + private const val PAGE_PRE_PATCH_DISTANCE = 1 + private const val EXTRA_PUBLIC_COURSE_ID = "publicCourseId" private const val EXTRA_ROOT_SCREEN = "rootScreen" const val EXTRA_EDITABLE_DISCOVER_COURSE = "editable_discover_course" diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index c8e276962..61ffeebd6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -2,6 +2,7 @@ package com.runnect.runnect.presentation.discover.adapter import android.view.LayoutInflater import android.view.ViewGroup +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendBinding @@ -9,10 +10,10 @@ import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse +import timber.log.Timber class DiscoverMultiViewAdapter( private val multiViewItems: List>, - private val onNextPageLoad: () -> Unit, private val onHeartButtonClick: (Int, Boolean) -> Unit, private val onCourseItemClick: (Int) -> Unit, private val handleVisitorMode: () -> Unit, @@ -51,7 +52,6 @@ class DiscoverMultiViewAdapter( parent, false ), - onNextPageLoad = onNextPageLoad, onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode, @@ -77,6 +77,7 @@ class DiscoverMultiViewAdapter( } } + // todo: 추천 코스 목록 갱신하기 (다음 페이지 로딩) fun updateRecommendCourses(courses: List) { recommendViewHolder.updateRecommendCourses(courses) } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 9f19d9a7e..11a1224ae 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -66,12 +66,10 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : class RecommendCourseViewHolder( private val binding: ItemDiscoverMultiviewRecommendBinding, - private val onNextPageLoad: () -> Unit, onHeartButtonClick: (Int, Boolean) -> Unit, onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit, ) : DiscoverMultiViewHolder(binding) { - private var recommendCourses = listOf() private val recommendAdapter by lazy { DiscoverRecommendAdapter( onHeartButtonClick, @@ -80,18 +78,16 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : ) } - fun bind(recommendCourses: List) { - this.recommendCourses = recommendCourses - initRecommendRecyclerView() - initScrollListener() + fun bind(courses: List) { + initRecommendRecyclerView(courses) } - private fun initRecommendRecyclerView() { + private fun initRecommendRecyclerView(courses: List) { binding.rvDiscoverRecommend.apply { setHasFixedSize(true) layoutManager = GridLayoutManager(context, 2) adapter = recommendAdapter.apply { - submitList(recommendCourses) + submitList(courses) } addItemDecoration( DiscoverRecommendItemDecoration( @@ -104,26 +100,6 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } - private fun initScrollListener() { - binding.rvDiscoverRecommend.addOnScrollListener(object : - RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - - val layoutManager = recyclerView.layoutManager as GridLayoutManager - val lastItemPosition = layoutManager.findLastCompletelyVisibleItemPosition() - - if (lastItemPosition + PRE_PATCH_DISTANCE >= layoutManager.itemCount) { - Timber.e("마지막 아이템 위치: ${lastItemPosition}") - Timber.e("현재 아이템 개수: ${layoutManager.itemCount}") - Timber.e("스크롤이 끝에 도달했어요!") - - onNextPageLoad.invoke() - } - } - }) - } - fun updateRecommendCourses(courses: List) { Timber.e("추천 코스를 갱신했어요!") recommendAdapter.submitList(courses) @@ -133,7 +109,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : publicCourseId: Int, updatedCourse: EditableDiscoverCourse ) { - recommendCourses.forEachIndexed { index, course -> + recommendAdapter.currentList.forEachIndexed { index, course -> if (course.id == publicCourseId) { course.title = updatedCourse.title course.scrap = updatedCourse.scrap @@ -143,8 +119,4 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } } - - companion object { - private const val PRE_PATCH_DISTANCE = 2 - } } From d1d21d2b87bb198208ff67c78b4177b76cce2e64 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 22:00:04 +0900 Subject: [PATCH 22/61] =?UTF-8?q?[MOD]=20#297=20=EB=A7=88=EB=9D=BC?= =?UTF-8?q?=ED=86=A4=20=EC=BD=94=EC=8A=A4=EC=9D=98=20=EB=B7=B0=ED=99=80?= =?UTF-8?q?=EB=8D=94=20=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 리스트를 따로 만들지 않고 어댑터에서 가져와 사용하도록 --- .../discover/adapter/DiscoverMultiViewHolder.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 11a1224ae..06a5b230d 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -21,29 +21,27 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit ) : DiscoverMultiViewHolder(binding) { - private var marathonCourses = listOf() private val marathonAdapter by lazy { DiscoverMarathonAdapter( onHeartButtonClick, onCourseItemClick, handleVisitorMode ) } - fun bind(marathonCourses: List) { - this.marathonCourses = marathonCourses - initMarathonRecyclerView() + fun bind(courses: List) { + initMarathonRecyclerView(courses) } - private fun initMarathonRecyclerView() { + private fun initMarathonRecyclerView(courses: List) { binding.rvDiscoverMarathon.apply { setHasFixedSize(true) adapter = marathonAdapter.apply { - submitList(marathonCourses) + submitList(courses) } addItemDecoration( DiscoverMarathonItemDecoration( context = context, spaceSize = 10, - itemCount = marathonCourses.size + itemCount = courses.size ) ) } @@ -53,7 +51,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : publicCourseId: Int, updatedCourse: EditableDiscoverCourse ) { - marathonCourses.forEachIndexed { index, course -> + marathonAdapter.currentList.forEachIndexed { index, course -> if (course.id == publicCourseId) { course.title = updatedCourse.title course.scrap = updatedCourse.scrap From 49f63a8438e072542761b5d84dce12bf02bcf0eb Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 22:01:11 +0900 Subject: [PATCH 23/61] =?UTF-8?q?[CHORE]=20#297=20=EB=A9=80=ED=8B=B0?= =?UTF-8?q?=EB=B7=B0=20=EC=96=B4=EB=8C=91=ED=84=B0=EC=97=90=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A7=80=EC=97=AD=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discover/adapter/DiscoverMultiViewAdapter.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 61ffeebd6..547502213 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -13,22 +13,23 @@ import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import timber.log.Timber class DiscoverMultiViewAdapter( - private val multiViewItems: List>, + multiViewItems: List>, private val onHeartButtonClick: (Int, Boolean) -> Unit, private val onCourseItemClick: (Int) -> Unit, private val handleVisitorMode: () -> Unit, ) : RecyclerView.Adapter() { + private val currentList = multiViewItems.toMutableList() private lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder private lateinit var recommendViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder override fun getItemViewType(position: Int): Int { - return when (multiViewItems[position].first()) { + return when (currentList[position].first()) { is MarathonCourse -> DiscoverCourseType.MARATHON.ordinal is RecommendCourse -> DiscoverCourseType.RECOMMEND.ordinal } } - override fun getItemCount(): Int = multiViewItems.size + override fun getItemCount(): Int = currentList.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMultiViewHolder { return when (viewType) { @@ -63,14 +64,14 @@ class DiscoverMultiViewAdapter( when (holder) { is DiscoverMultiViewHolder.MarathonCourseViewHolder -> { marathonViewHolder = holder - (multiViewItems[position] as? List)?.let { + (currentList[position] as? List)?.let { holder.bind(it) } } is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { recommendViewHolder = holder - (multiViewItems[position] as? List)?.let { + (currentList[position] as? List)?.let { holder.bind(it) } } @@ -86,7 +87,7 @@ class DiscoverMultiViewAdapter( publicCourseId: Int, updatedCourse: EditableDiscoverCourse ) { - val targetItem = multiViewItems.flatten().find { item -> + val targetItem = currentList.flatten().find { item -> item.id == publicCourseId } ?: return From f03af42fe0a50cc363ff9ca44bf631f4e8c858f1 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 22:05:23 +0900 Subject: [PATCH 24/61] =?UTF-8?q?[MOD]=20#264=20=EB=A9=80=ED=8B=B0=20?= =?UTF-8?q?=EB=B7=B0=20=ED=99=80=EB=8D=94=EC=97=90=EC=84=9C=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=A7=80=EC=97=AD=EB=B3=80=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EB=94=B0=EB=A1=9C=20=EB=A7=8C=EB=93=A4=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EA=B3=A0=20=EC=96=B4=EB=8C=91=ED=84=B0=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B0=B8=EC=A1=B0=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 --- .../adapter/DiscoverMultiViewHolder.kt | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index d29f3e423..97c05b8be 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -10,7 +10,6 @@ import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration -import timber.log.Timber sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : RecyclerView.ViewHolder(binding.root) { @@ -21,29 +20,27 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit ) : DiscoverMultiViewHolder(binding) { - private var marathonCourses = listOf() private val marathonAdapter by lazy { DiscoverMarathonAdapter( onHeartButtonClick, onCourseItemClick, handleVisitorMode ) } - fun bind(marathonCourses: List) { - this.marathonCourses = marathonCourses - initMarathonRecyclerView() + fun bind(courses: List) { + initMarathonRecyclerView(courses) } - private fun initMarathonRecyclerView() { + private fun initMarathonRecyclerView(courses: List) { binding.rvDiscoverMarathon.apply { setHasFixedSize(true) adapter = marathonAdapter.apply { - submitList(marathonCourses) + submitList(courses) } addItemDecoration( DiscoverMarathonItemDecoration( context = context, spaceSize = 10, - itemCount = marathonCourses.size + itemCount = courses.size ) ) } @@ -53,7 +50,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : publicCourseId: Int, updatedCourse: EditableDiscoverCourse ) { - marathonCourses.forEachIndexed { index, course -> + marathonAdapter.currentList.forEachIndexed { index, course -> if (course.id == publicCourseId) { course.title = updatedCourse.title course.scrap = updatedCourse.scrap @@ -70,7 +67,6 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit, ) : DiscoverMultiViewHolder(binding) { - private var recommendCourses = listOf() private val recommendAdapter by lazy { DiscoverRecommendAdapter( onHeartButtonClick, @@ -79,17 +75,16 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : ) } - fun bind(recommendCourses: List) { - this.recommendCourses = recommendCourses - initRecommendRecyclerView() + fun bind(courses: List) { + initRecommendRecyclerView(courses) } - private fun initRecommendRecyclerView() { + private fun initRecommendRecyclerView(courses: List) { binding.rvDiscoverRecommend.apply { setHasFixedSize(true) layoutManager = GridLayoutManager(context, 2) adapter = recommendAdapter.apply { - submitList(recommendCourses) + submitList(courses) } addItemDecoration( DiscoverRecommendItemDecoration( @@ -106,7 +101,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : publicCourseId: Int, updatedCourse: EditableDiscoverCourse ) { - recommendCourses.forEachIndexed { index, course -> + recommendAdapter.currentList.forEachIndexed { index, course -> if (course.id == publicCourseId) { course.title = updatedCourse.title course.scrap = updatedCourse.scrap @@ -115,14 +110,5 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } } - - private fun initScrollListener(currentPageNumber: Int, recyclerView: RecyclerView) { - recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - super.onScrolled(recyclerView, dx, dy) - // TODO: 스크롤이 최하단까지 내려간 경우, 다음 페이지 요청하기 (다음 페이지가 있는 경우에만) - } - }) - } } } From 491e36834c5c5a794a7e4fd826c3ab3aa4a9ce07 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 22:17:47 +0900 Subject: [PATCH 25/61] =?UTF-8?q?[FIX]=20#297=20=EB=8B=A4=EC=9D=8C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9A=94=EC=B2=AD=ED=95=A0=20?= =?UTF-8?q?=EB=95=8C=EB=A7=88=EB=8B=A4=20=EB=B7=B0=EB=AA=A8=EB=8D=B8?= =?UTF-8?q?=EC=9D=98=20isEnd=20=EC=86=8D=EC=84=B1=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/presentation/discover/DiscoverViewModel.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index e4cfb1932..ea97816a6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -140,12 +140,14 @@ class DiscoverViewModel @Inject constructor( ordering = "date" ) .onSuccess { pagingData -> - val recommendCourses = multiViewItems[DiscoverCourseType.RECOMMEND.ordinal] + pagingData.isEnd?.let { + isRecommendCoursePageEnd = it + } + val recommendCourses = multiViewItems[DiscoverCourseType.RECOMMEND.ordinal] (recommendCourses as? List)?.let { val nextPageCourses = pagingData.recommendCourses ?: return@onSuccess val newCourses = it.plus(nextPageCourses) - _nextPageState.value = UiStateV2.Success(newCourses) Timber.d("RECOMMEND COURSE NEXT PAGE GET SUCCESS") } From 57d64a2a4f4df337fc6961c867001f78ae930112 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 22:34:26 +0900 Subject: [PATCH 26/61] =?UTF-8?q?[FIX]=20#297=20=EB=82=B4=EB=B6=80,=20?= =?UTF-8?q?=EC=99=B8=EB=B6=80=20=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4?= =?UTF-8?q?=EB=9F=AC=EB=B7=B0=20=EB=AA=A8=EB=91=90=20=EA=B0=B1=EC=8B=A0?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EB=AC=B4=ED=95=9C=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverFragment.kt | 6 ++---- .../presentation/discover/DiscoverViewModel.kt | 8 ++------ .../adapter/DiscoverMultiViewAdapter.kt | 17 +++++++++++++---- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 5f90f7d43..01aab6af9 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -9,7 +9,6 @@ import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.core.view.isVisible import androidx.fragment.app.viewModels -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 @@ -23,7 +22,6 @@ import com.runnect.runnect.presentation.MainActivity.Companion.isVisitorMode import com.runnect.runnect.presentation.detail.CourseDetailActivity import com.runnect.runnect.presentation.detail.CourseDetailRootScreen import com.runnect.runnect.presentation.discover.adapter.BannerAdapter -import com.runnect.runnect.presentation.discover.adapter.DiscoverCourseType import com.runnect.runnect.presentation.discover.adapter.DiscoverMultiViewAdapter import com.runnect.runnect.presentation.discover.pick.DiscoverPickActivity import com.runnect.runnect.presentation.discover.search.DiscoverSearchActivity @@ -370,8 +368,8 @@ class DiscoverFragment : BindingFragment(R.layout.fragm viewModel.nextPageState.observe(viewLifecycleOwner) { state -> when (state) { is UiStateV2.Success -> { - val recommendCourses = state.data - multiViewAdapter.updateRecommendCourses(recommendCourses) + val nextPageCourses = state.data + multiViewAdapter.updateRecommendCourses(nextPageCourses) } is UiStateV2.Failure -> { diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index ea97816a6..563c99ec7 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -128,7 +128,6 @@ class DiscoverViewModel @Inject constructor( } } - // todo: 내부 리사이클러뷰에서만 submitList 해도 변경사항이 반영될까? 외부 리사이클러뷰는 notify 안해도 되는 걸까? fun getRecommendCourseNextPage() { viewModelScope.launch { if (isRecommendCoursePageEnd) return@launch @@ -144,11 +143,8 @@ class DiscoverViewModel @Inject constructor( isRecommendCoursePageEnd = it } - val recommendCourses = multiViewItems[DiscoverCourseType.RECOMMEND.ordinal] - (recommendCourses as? List)?.let { - val nextPageCourses = pagingData.recommendCourses ?: return@onSuccess - val newCourses = it.plus(nextPageCourses) - _nextPageState.value = UiStateV2.Success(newCourses) + pagingData.recommendCourses?.let { + _nextPageState.value = UiStateV2.Success(it) Timber.d("RECOMMEND COURSE NEXT PAGE GET SUCCESS") } } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 547502213..7ed5ff615 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -2,7 +2,6 @@ package com.runnect.runnect.presentation.discover.adapter import android.view.LayoutInflater import android.view.ViewGroup -import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendBinding @@ -10,7 +9,6 @@ import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse -import timber.log.Timber class DiscoverMultiViewAdapter( multiViewItems: List>, @@ -79,10 +77,21 @@ class DiscoverMultiViewAdapter( } // todo: 추천 코스 목록 갱신하기 (다음 페이지 로딩) - fun updateRecommendCourses(courses: List) { - recommendViewHolder.updateRecommendCourses(courses) + fun updateRecommendCourses(nextPageCourses: List) { + val itemPosition = DiscoverCourseType.RECOMMEND.ordinal + + (currentList[itemPosition] as? List)?.let { originalCourses -> + // 내부 리사이클러뷰 갱신 + val newCourses = originalCourses.plus(nextPageCourses) + recommendViewHolder.updateRecommendCourses(newCourses) + + // 외부 리사이클러뷰 갱신 + currentList[itemPosition] = newCourses + notifyItemChanged(itemPosition) + } } + // todo: 다음 페이지 요청에 따라 currentList 데이터도 달라져야 한다. fun updateCourseItem( publicCourseId: Int, updatedCourse: EditableDiscoverCourse From 1a629c2d40cc81450d5732f1366a3a2dcc9eebb5 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 22:56:52 +0900 Subject: [PATCH 27/61] =?UTF-8?q?[FIX]=20#297=20=EC=99=B8=EB=B6=80=20?= =?UTF-8?q?=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC=EB=B7=B0=20notify?= =?UTF-8?q?ItemChanged=20->=20=EB=82=B4=EB=B6=80=20=EB=A6=AC=EC=82=AC?= =?UTF-8?q?=EC=9D=B4=ED=81=B4=EB=9F=AC=EB=B7=B0=20submitList=20=EC=8B=A4?= =?UTF-8?q?=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discover/adapter/DiscoverMultiViewAdapter.kt | 6 ++---- .../discover/adapter/DiscoverMultiViewHolder.kt | 1 + .../util/custom/deco/DiscoverRecommendItemDecoration.kt | 5 +++++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 7ed5ff615..30fb29c75 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -81,12 +81,10 @@ class DiscoverMultiViewAdapter( val itemPosition = DiscoverCourseType.RECOMMEND.ordinal (currentList[itemPosition] as? List)?.let { originalCourses -> - // 내부 리사이클러뷰 갱신 val newCourses = originalCourses.plus(nextPageCourses) - recommendViewHolder.updateRecommendCourses(newCourses) - - // 외부 리사이클러뷰 갱신 currentList[itemPosition] = newCourses + + // todo: 리사이클러뷰 전체를 notify -> 아이템 데코가 누적된다! notifyItemChanged(itemPosition) } } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 06a5b230d..76a1382c2 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -77,6 +77,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } fun bind(courses: List) { + Timber.e("추천 코스 리스트 바인딩!!!") initRecommendRecyclerView(courses) } diff --git a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt index 2677e0e74..62c961d9b 100644 --- a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt +++ b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt @@ -5,6 +5,7 @@ import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.util.extension.dpToPx +import timber.log.Timber class DiscoverRecommendItemDecoration( context: Context, @@ -15,6 +16,10 @@ class DiscoverRecommendItemDecoration( private val rightSpacingPx = rightSpacing.dpToPx(context) private val bottomSpacingPx = bottomSpacing.dpToPx(context) + init { + Timber.e("rightPx: $rightSpacingPx, bottomPx: $bottomSpacingPx") + } + override fun getItemOffsets( outRect: Rect, // 아이템의 사각형 영역 view: View, // 아이템 뷰 From 862edd7a0f4579c63dd4efa78a17ae4992f34371 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 23:05:02 +0900 Subject: [PATCH 28/61] =?UTF-8?q?[FIX]=20#297=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EB=8D=B0=EC=BD=94=EA=B0=80=20=EB=88=84=EC=A0=81?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EC=A0=81=EC=9A=A9=EB=90=98=EB=8A=94=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discover/adapter/DiscoverMultiViewAdapter.kt | 2 -- .../discover/adapter/DiscoverMultiViewHolder.kt | 9 +++++++++ .../util/custom/deco/DiscoverRecommendItemDecoration.kt | 4 ---- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 30fb29c75..93a45e3c8 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -83,8 +83,6 @@ class DiscoverMultiViewAdapter( (currentList[itemPosition] as? List)?.let { originalCourses -> val newCourses = originalCourses.plus(nextPageCourses) currentList[itemPosition] = newCourses - - // todo: 리사이클러뷰 전체를 notify -> 아이템 데코가 누적된다! notifyItemChanged(itemPosition) } } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 76a1382c2..d65f6686a 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -88,6 +88,15 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : adapter = recommendAdapter.apply { submitList(courses) } + addItemDecorationOnlyOnce(this) + } + } + + private fun addItemDecorationOnlyOnce(recyclerView: RecyclerView) { + with(recyclerView) { + if (itemDecorationCount > 0) { + removeItemDecorationAt(0) + } addItemDecoration( DiscoverRecommendItemDecoration( context = context, diff --git a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt index 62c961d9b..547105ce5 100644 --- a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt +++ b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt @@ -16,10 +16,6 @@ class DiscoverRecommendItemDecoration( private val rightSpacingPx = rightSpacing.dpToPx(context) private val bottomSpacingPx = bottomSpacing.dpToPx(context) - init { - Timber.e("rightPx: $rightSpacingPx, bottomPx: $bottomSpacingPx") - } - override fun getItemOffsets( outRect: Rect, // 아이템의 사각형 영역 view: View, // 아이템 뷰 From c1940c0ee471c585c9f10ea28be2100b29fb4dcc Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 23:09:54 +0900 Subject: [PATCH 29/61] =?UTF-8?q?[DEL]=20#297=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 01aab6af9..bde42a119 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -437,8 +437,6 @@ class DiscoverFragment : BindingFragment(R.layout.fragm companion object { private const val BANNER_SCROLL_DELAY_TIME = 5000L private const val CENTER_POS_OF_INFINITE_BANNERS = Int.MAX_VALUE / 2 - private const val PAGE_PRE_PATCH_DISTANCE = 1 - private const val EXTRA_PUBLIC_COURSE_ID = "publicCourseId" private const val EXTRA_ROOT_SCREEN = "rootScreen" const val EXTRA_EDITABLE_DISCOVER_COURSE = "editable_discover_course" From 025de50bc1258ef772abbc2c5e09bcc43fffa7b6 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 23:15:16 +0900 Subject: [PATCH 30/61] =?UTF-8?q?[DEL]=20#297=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=ED=98=95=EB=B3=80=ED=99=98=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discover/adapter/DiscoverMultiViewAdapter.kt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 93a45e3c8..132327ee0 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -78,13 +78,10 @@ class DiscoverMultiViewAdapter( // todo: 추천 코스 목록 갱신하기 (다음 페이지 로딩) fun updateRecommendCourses(nextPageCourses: List) { - val itemPosition = DiscoverCourseType.RECOMMEND.ordinal - - (currentList[itemPosition] as? List)?.let { originalCourses -> - val newCourses = originalCourses.plus(nextPageCourses) - currentList[itemPosition] = newCourses - notifyItemChanged(itemPosition) - } + val position = DiscoverCourseType.RECOMMEND.ordinal + val newCourses = currentList[position].plus(nextPageCourses) + currentList[position] = newCourses + notifyItemChanged(position) } // todo: 다음 페이지 요청에 따라 currentList 데이터도 달라져야 한다. From 7eeff9b6a7623072e707eb60821a97afb2e79ed0 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 23:16:01 +0900 Subject: [PATCH 31/61] =?UTF-8?q?[DEL]=20#297=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/adapter/DiscoverMultiViewHolder.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index d65f6686a..eebb0fd5b 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -108,11 +108,6 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } - fun updateRecommendCourses(courses: List) { - Timber.e("추천 코스를 갱신했어요!") - recommendAdapter.submitList(courses) - } - fun updateRecommendCourseItem( publicCourseId: Int, updatedCourse: EditableDiscoverCourse From 0d29825f53b1fb3a62b40bbb393222ca3b4e4d3d Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 23:38:37 +0900 Subject: [PATCH 32/61] =?UTF-8?q?[CHORE]=20#297=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EA=B4=80=EB=A0=A8=20=EC=A3=BC=EC=84=9D=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/adapter/DiscoverMultiViewAdapter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 132327ee0..20fb3e7fa 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -81,6 +81,8 @@ class DiscoverMultiViewAdapter( val position = DiscoverCourseType.RECOMMEND.ordinal val newCourses = currentList[position].plus(nextPageCourses) currentList[position] = newCourses + + // todo: 이걸 호출하면 바로 이전 페이지의 첫번째 아이템 위치로 스크롤이 초기화 된다...... notifyItemChanged(position) } From ff07437b053ea04e662ca9fe60944710447d3acf Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 19 Dec 2023 23:40:29 +0900 Subject: [PATCH 33/61] =?UTF-8?q?[CHORE]=20#297=20=EB=8B=A4=EC=9D=8C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20=ED=95=A8=EC=88=98=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 2 +- .../presentation/discover/adapter/DiscoverMultiViewAdapter.kt | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index bde42a119..b89f5cdf6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -369,7 +369,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm when (state) { is UiStateV2.Success -> { val nextPageCourses = state.data - multiViewAdapter.updateRecommendCourses(nextPageCourses) + multiViewAdapter.loadRecommendCourseNextPage(nextPageCourses) } is UiStateV2.Failure -> { diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 20fb3e7fa..086a0b01d 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -76,8 +76,7 @@ class DiscoverMultiViewAdapter( } } - // todo: 추천 코스 목록 갱신하기 (다음 페이지 로딩) - fun updateRecommendCourses(nextPageCourses: List) { + fun loadRecommendCourseNextPage(nextPageCourses: List) { val position = DiscoverCourseType.RECOMMEND.ordinal val newCourses = currentList[position].plus(nextPageCourses) currentList[position] = newCourses @@ -86,7 +85,6 @@ class DiscoverMultiViewAdapter( notifyItemChanged(position) } - // todo: 다음 페이지 요청에 따라 currentList 데이터도 달라져야 한다. fun updateCourseItem( publicCourseId: Int, updatedCourse: EditableDiscoverCourse From e632f3271233e22dc2c1d22b3878dc3c65577c89 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 00:56:39 +0900 Subject: [PATCH 34/61] =?UTF-8?q?[REFACTOR]=20#297=20=EC=8A=A4=ED=81=AC?= =?UTF-8?q?=EB=A1=A4=20=EB=B0=A9=ED=96=A5=EC=9D=84=20=EB=82=98=ED=83=80?= =?UTF-8?q?=EB=82=B4=EB=8A=94=20=EC=83=81=EC=88=98=20const=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index b89f5cdf6..c040f7bae 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -148,7 +148,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm val isScrollDown = dy > 0 if (isScrollDown) showCircleUploadButton() - if (!recyclerView.canScrollVertically(1)) { + if (!recyclerView.canScrollVertically(SCROLL_DIRECTION)) { Timber.e("스크롤이 끝에 도달했어요!") viewModel.getRecommendCourseNextPage() } @@ -437,6 +437,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm companion object { private const val BANNER_SCROLL_DELAY_TIME = 5000L private const val CENTER_POS_OF_INFINITE_BANNERS = Int.MAX_VALUE / 2 + private const val SCROLL_DIRECTION = 1 private const val EXTRA_PUBLIC_COURSE_ID = "publicCourseId" private const val EXTRA_ROOT_SCREEN = "rootScreen" const val EXTRA_EDITABLE_DISCOVER_COURSE = "editable_discover_course" From 3d924fe2fe55959510a2d736f248fcc651c718a7 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 01:00:04 +0900 Subject: [PATCH 35/61] =?UTF-8?q?[FEAT]=20#264=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EA=B0=80=20=EB=B9=84=EC=96=B4?= =?UTF-8?q?=EC=9E=88=EC=9C=BC=EB=A9=B4=20=EB=9F=AC=EB=8B=9D=20=EC=8B=9C?= =?UTF-8?q?=EC=9E=91=20=ED=99=94=EB=A9=B4=EC=9C=BC=EB=A1=9C=20=EB=84=98?= =?UTF-8?q?=EC=96=B4=EA=B0=80=EC=A7=80=20=EB=AA=BB=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=8A=A4=EB=82=B5=EB=B0=94=20=EB=9D=84=EC=9A=B0?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/CourseDetailActivity.kt | 44 +++++++++++-------- .../presentation/discover/DiscoverFragment.kt | 10 ++--- .../runnect/util/extension/ContextExt.kt | 13 +++--- app/src/main/res/values/strings.xml | 1 + 4 files changed, 40 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt index 4c2121300..f240bc262 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt @@ -287,24 +287,33 @@ class CourseDetailActivity : return@setOnClickListener } - Intent( - this@CourseDetailActivity, - CountDownActivity::class.java - ).apply { - putExtra( - EXTRA_COURSE_DATA, CourseData( - courseId = courseDetail.courseId, - publicCourseId = courseDetail.id, - touchList = connectedSpots, - startLatLng = departureLatLng, - departure = courseDetail.departure, - distance = courseDetail.distance.toFloat(), - image = courseDetail.image, - dataFrom = "detail" - ) - ) - startActivity(this) + if (!::departureLatLng.isInitialized || connectedSpots.isEmpty()) { + showSnackbar(binding.root, getString(R.string.course_detail_list_empty_error_msg)) + return@setOnClickListener } + + navigateToCountDownActivity() + } + } + + private fun navigateToCountDownActivity() { + Intent( + this@CourseDetailActivity, + CountDownActivity::class.java + ).apply { + putExtra( + EXTRA_COURSE_DATA, CourseData( + courseId = courseDetail.courseId, + publicCourseId = courseDetail.id, + touchList = connectedSpots, + startLatLng = departureLatLng, + departure = courseDetail.departure, + distance = courseDetail.distance.toFloat(), + image = courseDetail.image, + dataFrom = "detail" + ) + ) + startActivity(this) } } @@ -470,7 +479,6 @@ class CourseDetailActivity : } private fun initDepartureLatLng() { - Timber.e("${courseDetail.path}") if (courseDetail.path.isNotEmpty()) { departureLatLng = LatLng(courseDetail.path[0][0], courseDetail.path[0][1]) } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 7474c11d1..0dc737d13 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -31,7 +31,7 @@ import com.runnect.runnect.util.custom.toast.RunnectToast import com.runnect.runnect.util.extension.applyScreenEnterAnimation import com.runnect.runnect.util.extension.getCompatibleParcelableExtra import com.runnect.runnect.util.extension.navigateToPreviousScreenWithAnimation -import com.runnect.runnect.util.extension.showSnackbar +import com.runnect.runnect.util.extension.showDiscoverSnackbar import com.runnect.runnect.util.extension.showWebBrowser import com.runnect.runnect.util.extension.viewLifeCycleScope import dagger.hilt.android.AndroidEntryPoint @@ -225,7 +225,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm } is UiStateV2.Failure -> { - context?.showSnackbar(binding.root, state.msg) + context?.showDiscoverSnackbar(binding.root, state.msg) } else -> {} @@ -275,7 +275,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm is UiStateV2.Failure -> { dismissLoadingProgressBar() - context?.showSnackbar(binding.root, state.msg) + context?.showDiscoverSnackbar(binding.root, state.msg) } else -> {} @@ -298,7 +298,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm is UiStateV2.Failure -> { dismissLoadingProgressBar() - context?.showSnackbar(binding.root, state.msg) + context?.showDiscoverSnackbar(binding.root, state.msg) } else -> {} @@ -359,7 +359,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun setupCourseScrapStateObserver() { viewModel.courseScrapState.observe(viewLifecycleOwner) { state -> if (state is UiStateV2.Failure) { - context?.showSnackbar(binding.root, state.msg) + context?.showDiscoverSnackbar(binding.root, state.msg) } } } diff --git a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt index 3cab9548f..e555d1af2 100644 --- a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt +++ b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt @@ -172,12 +172,15 @@ fun Context.showToast(message: String) { } fun Context.showSnackbar(anchorView: View, message: String) { + Snackbar.make(anchorView, message, Snackbar.LENGTH_SHORT).show() +} + +fun Context.showDiscoverSnackbar(anchorView: View, message: String) { val snackbar = Snackbar.make(anchorView, message, Snackbar.LENGTH_SHORT) - snackbar.view.apply { - val params = layoutParams as? CoordinatorLayout.LayoutParams - params?.gravity = Gravity.TOP - layoutParams = params - } + val params = snackbar.view.layoutParams as CoordinatorLayout.LayoutParams + params.anchorGravity = Gravity.TOP + params.gravity = Gravity.TOP + snackbar.view.layoutParams = params snackbar.show() } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 997cef47e..90500461a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -152,6 +152,7 @@ 수정이 완료되었습니다 + Error: 코스 데이터가 비어있습니다. 2023 마라톤 코스 From cc0cf5f3b7d7aa18f9f0504bc7db0b76e6773e82 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 12:54:58 +0900 Subject: [PATCH 36/61] =?UTF-8?q?[MOD]=20#297=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EB=A9=80=ED=8B=B0=EB=B7=B0=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=EC=9D=84=20=ED=97=A4=EB=8D=94=EC=99=80=20?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=EB=B6=80=EB=B6=84=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item_discover_multiview_recommend.xml | 104 ------------------ ...em_discover_multiview_recommend_course.xml | 27 +++++ ...em_discover_multiview_recommend_header.xml | 84 ++++++++++++++ 3 files changed, 111 insertions(+), 104 deletions(-) delete mode 100644 app/src/main/res/layout/item_discover_multiview_recommend.xml create mode 100644 app/src/main/res/layout/item_discover_multiview_recommend_course.xml create mode 100644 app/src/main/res/layout/item_discover_multiview_recommend_header.xml diff --git a/app/src/main/res/layout/item_discover_multiview_recommend.xml b/app/src/main/res/layout/item_discover_multiview_recommend.xml deleted file mode 100644 index a6ac7bedf..000000000 --- a/app/src/main/res/layout/item_discover_multiview_recommend.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/item_discover_multiview_recommend_course.xml b/app/src/main/res/layout/item_discover_multiview_recommend_course.xml new file mode 100644 index 000000000..bf62bf6ae --- /dev/null +++ b/app/src/main/res/layout/item_discover_multiview_recommend_course.xml @@ -0,0 +1,27 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_discover_multiview_recommend_header.xml b/app/src/main/res/layout/item_discover_multiview_recommend_header.xml new file mode 100644 index 000000000..6b20e5735 --- /dev/null +++ b/app/src/main/res/layout/item_discover_multiview_recommend_header.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file From 380a9aec8d4d19860f0b3fa13286624001a17c06 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 13:25:23 +0900 Subject: [PATCH 37/61] =?UTF-8?q?[FEAT]=20#297=20=EB=A7=88=EB=9D=BC?= =?UTF-8?q?=ED=86=A4=20=EC=BD=94=EC=8A=A4=20=EC=A1=B0=ED=9A=8C=20=EC=9D=B4?= =?UTF-8?q?=ED=9B=84,=20=EC=B6=94=EC=B2=9C=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=ED=97=A4=EB=8D=94=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/DiscoverMultiViewItem.kt | 9 ++ .../presentation/discover/DiscoverFragment.kt | 13 ++ .../discover/DiscoverViewModel.kt | 5 +- .../discover/adapter/DiscoverCourseType.kt | 6 - .../adapter/DiscoverMultiViewAdapter.kt | 39 +++-- .../adapter/DiscoverMultiViewHolder.kt | 11 +- .../discover/adapter/DiscoverMultiViewType.kt | 7 + ...em_discover_multiview_recommend_header.xml | 143 +++++++++--------- 8 files changed, 141 insertions(+), 92 deletions(-) delete mode 100644 app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt create mode 100644 app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewType.kt diff --git a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt index 9e1c9600c..d16132a14 100644 --- a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt +++ b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt @@ -12,6 +12,11 @@ sealed class DiscoverMultiViewItem( val departure: String, ) : DiscoverMultiViewItem(id) + data class RecommendHeader( + val title: String, + val subtitle: String + ) : DiscoverMultiViewItem(HEADER_ID) + data class RecommendCourse( override val id: Int, val courseId: Int, @@ -20,4 +25,8 @@ sealed class DiscoverMultiViewItem( var scrap: Boolean, val departure: String, ) : DiscoverMultiViewItem(id) + + companion object { + private const val HEADER_ID = -1 + } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index c040f7bae..25644f3b0 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -16,6 +16,7 @@ import com.runnect.runnect.R import com.runnect.runnect.binding.BindingFragment import com.runnect.runnect.databinding.FragmentDiscoverBinding import com.runnect.runnect.domain.entity.DiscoverBanner +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.presentation.MainActivity import com.runnect.runnect.presentation.MainActivity.Companion.isVisitorMode @@ -281,6 +282,10 @@ class DiscoverFragment : BindingFragment(R.layout.fragm when (state) { is UiStateV2.Loading -> showLoadingProgressBar() + is UiStateV2.Success -> { + addRecommendHeaderView() + } + is UiStateV2.Failure -> { dismissLoadingProgressBar() context?.showSnackbar(binding.root, state.msg) @@ -291,6 +296,14 @@ class DiscoverFragment : BindingFragment(R.layout.fragm } } + private fun addRecommendHeaderView() { + val header = DiscoverMultiViewItem.RecommendHeader( + title = getString(R.string.discover_recommend_header_title), + subtitle = getString(R.string.discover_marathon_header_subtitle) + ) + viewModel.addRecommendHeaderView(listOf(header)) + } + private fun setupRecommendCourseGetStateObserver() { viewModel.recommendCourseState.observe(viewLifecycleOwner) { state -> when (state) { diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index 563c99ec7..a20d8399d 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -10,7 +10,6 @@ import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.domain.entity.DiscoverBanner import com.runnect.runnect.domain.repository.BannerRepository import com.runnect.runnect.domain.repository.CourseRepository -import com.runnect.runnect.presentation.discover.adapter.DiscoverCourseType import com.runnect.runnect.presentation.state.UiStateV2 import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.catch @@ -105,6 +104,10 @@ class DiscoverViewModel @Inject constructor( } } + fun addRecommendHeaderView(headers: List) { + _multiViewItems.add(headers) + } + fun getRecommendCourse(pageNo: Int, ordering: String) { viewModelScope.launch { _recommendCourseState.value = UiStateV2.Loading diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt deleted file mode 100644 index 45fef8330..000000000 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverCourseType.kt +++ /dev/null @@ -1,6 +0,0 @@ -package com.runnect.runnect.presentation.discover.adapter - -enum class DiscoverCourseType { - MARATHON, - RECOMMEND -} diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 086a0b01d..8e733d38b 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -4,10 +4,10 @@ import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding -import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendBinding +import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendCourseBinding +import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendHeaderBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse class DiscoverMultiViewAdapter( @@ -22,8 +22,9 @@ class DiscoverMultiViewAdapter( override fun getItemViewType(position: Int): Int { return when (currentList[position].first()) { - is MarathonCourse -> DiscoverCourseType.MARATHON.ordinal - is RecommendCourse -> DiscoverCourseType.RECOMMEND.ordinal + is MarathonCourse -> DiscoverMultiViewType.MARATHON.ordinal + is RecommendHeader -> DiscoverMultiViewType.RECOMMEND_HEADER.ordinal + is RecommendCourse -> DiscoverMultiViewType.RECOMMEND_COURSE.ordinal } } @@ -31,7 +32,7 @@ class DiscoverMultiViewAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMultiViewHolder { return when (viewType) { - DiscoverCourseType.MARATHON.ordinal -> { + DiscoverMultiViewType.MARATHON.ordinal -> { DiscoverMultiViewHolder.MarathonCourseViewHolder( binding = ItemDiscoverMultiviewMarathonBinding.inflate( LayoutInflater.from(parent.context), @@ -44,9 +45,19 @@ class DiscoverMultiViewAdapter( ) } + DiscoverMultiViewType.RECOMMEND_HEADER.ordinal -> { + DiscoverMultiViewHolder.RecommendHeaderViewHolder( + binding = ItemDiscoverMultiviewRecommendHeaderBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + } + else -> { DiscoverMultiViewHolder.RecommendCourseViewHolder( - binding = ItemDiscoverMultiviewRecommendBinding.inflate( + binding = ItemDiscoverMultiviewRecommendCourseBinding.inflate( LayoutInflater.from(parent.context), parent, false @@ -58,6 +69,7 @@ class DiscoverMultiViewAdapter( } } } + override fun onBindViewHolder(holder: DiscoverMultiViewHolder, position: Int) { when (holder) { is DiscoverMultiViewHolder.MarathonCourseViewHolder -> { @@ -67,6 +79,10 @@ class DiscoverMultiViewAdapter( } } + is DiscoverMultiViewHolder.RecommendHeaderViewHolder -> { + + } + is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { recommendViewHolder = holder (currentList[position] as? List)?.let { @@ -76,13 +92,10 @@ class DiscoverMultiViewAdapter( } } + // todo: 추천 코스 헤더 텍스트를 별도의 멀티 뷰 타입으로 분리하자! 팩토리 패턴 적용! fun loadRecommendCourseNextPage(nextPageCourses: List) { - val position = DiscoverCourseType.RECOMMEND.ordinal - val newCourses = currentList[position].plus(nextPageCourses) - currentList[position] = newCourses - - // todo: 이걸 호출하면 바로 이전 페이지의 첫번째 아이템 위치로 스크롤이 초기화 된다...... - notifyItemChanged(position) + currentList.add(nextPageCourses) + notifyItemInserted(itemCount - 1) } fun updateCourseItem( diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index eebb0fd5b..c74d651f2 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -4,7 +4,8 @@ import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding -import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendBinding +import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendCourseBinding +import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendHeaderBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse @@ -62,8 +63,14 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } + class RecommendHeaderViewHolder( + binding: ItemDiscoverMultiviewRecommendHeaderBinding + ) : DiscoverMultiViewHolder(binding) { + // todo: 정렬 버튼 클릭 리스너 구현 (일단은 뷰 바인딩만 확인하자) + } + class RecommendCourseViewHolder( - private val binding: ItemDiscoverMultiviewRecommendBinding, + private val binding: ItemDiscoverMultiviewRecommendCourseBinding, onHeartButtonClick: (Int, Boolean) -> Unit, onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit, diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewType.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewType.kt new file mode 100644 index 000000000..377d14b37 --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewType.kt @@ -0,0 +1,7 @@ +package com.runnect.runnect.presentation.discover.adapter + +enum class DiscoverMultiViewType { + MARATHON, + RECOMMEND_HEADER, + RECOMMEND_COURSE +} diff --git a/app/src/main/res/layout/item_discover_multiview_recommend_header.xml b/app/src/main/res/layout/item_discover_multiview_recommend_header.xml index 6b20e5735..b9cbed44d 100644 --- a/app/src/main/res/layout/item_discover_multiview_recommend_header.xml +++ b/app/src/main/res/layout/item_discover_multiview_recommend_header.xml @@ -1,84 +1,87 @@ - - - + android:layout_width="match_parent" + android:layout_height="wrap_content"> - - + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/divider_discover_course"> - + - + - + + + - \ No newline at end of file + + + + \ No newline at end of file From 004a3f767e76ec24fb946ac06c05ab32c9e6da14 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 13:33:49 +0900 Subject: [PATCH 38/61] =?UTF-8?q?[FEAT]=20#297=20=EC=B6=94=EC=B2=9C?= =?UTF-8?q?=EC=BD=94=EC=8A=A4=20=ED=97=A4=EB=8D=94=20=ED=85=8D=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=97=90=20=EB=8C=80=ED=95=B4=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EB=B0=94=EC=9D=B8=EB=94=A9=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/DiscoverMultiViewAdapter.kt | 4 +++- .../adapter/DiscoverMultiViewHolder.kt | 11 ++++++---- ...em_discover_multiview_recommend_header.xml | 20 ++++++++++++++----- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 8e733d38b..d510606d3 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -80,7 +80,9 @@ class DiscoverMultiViewAdapter( } is DiscoverMultiViewHolder.RecommendHeaderViewHolder -> { - + (currentList[position] as? List)?.let { + holder.bind(it) + } } is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index c74d651f2..322495ef5 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -6,8 +6,8 @@ import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendCourseBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendHeaderBinding -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration @@ -63,10 +63,13 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } + // todo: 정렬 버튼 클릭 리스너 구현 class RecommendHeaderViewHolder( - binding: ItemDiscoverMultiviewRecommendHeaderBinding + private val binding: ItemDiscoverMultiviewRecommendHeaderBinding ) : DiscoverMultiViewHolder(binding) { - // todo: 정렬 버튼 클릭 리스너 구현 (일단은 뷰 바인딩만 확인하자) + fun bind(headers: List) { + binding.header = headers.first() + } } class RecommendCourseViewHolder( diff --git a/app/src/main/res/layout/item_discover_multiview_recommend_header.xml b/app/src/main/res/layout/item_discover_multiview_recommend_header.xml index b9cbed44d..9cde9fdae 100644 --- a/app/src/main/res/layout/item_discover_multiview_recommend_header.xml +++ b/app/src/main/res/layout/item_discover_multiview_recommend_header.xml @@ -1,6 +1,14 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools"> + + + + + + app:layout_constraintTop_toTopOf="parent" + tools:text="@string/discover_recommend_header_title" /> + app:layout_constraintTop_toBottomOf="@id/tv_discover_recommend_title" + tools:text="@string/discover_recommend_header_subtitle" /> Date: Wed, 20 Dec 2023 14:09:01 +0900 Subject: [PATCH 39/61] =?UTF-8?q?[REFACTOR]=20#297=20=EB=A9=80=ED=8B=B0=20?= =?UTF-8?q?=EB=B7=B0=20=ED=99=80=EB=8D=94=20=EC=83=9D=EC=84=B1=20=EC=8B=9C?= =?UTF-8?q?,=20=ED=8C=A9=ED=86=A0=EB=A6=AC=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverFragment.kt | 2 +- .../adapter/DiscoverMultiViewAdapter.kt | 55 +++++-------------- .../adapter/DiscoverMultiViewHolder.kt | 1 - .../adapter/DiscoverMultiViewHolderFactory.kt | 54 ++++++++++++++++++ 4 files changed, 68 insertions(+), 44 deletions(-) create mode 100644 app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolderFactory.kt diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 25644f3b0..ca87a08d6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -382,7 +382,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm when (state) { is UiStateV2.Success -> { val nextPageCourses = state.data - multiViewAdapter.loadRecommendCourseNextPage(nextPageCourses) + multiViewAdapter.addRecommendCourseNextPage(nextPageCourses) } is UiStateV2.Failure -> { diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index d510606d3..9063aa0bc 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -31,71 +31,42 @@ class DiscoverMultiViewAdapter( override fun getItemCount(): Int = currentList.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMultiViewHolder { - return when (viewType) { - DiscoverMultiViewType.MARATHON.ordinal -> { - DiscoverMultiViewHolder.MarathonCourseViewHolder( - binding = ItemDiscoverMultiviewMarathonBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ), - onHeartButtonClick = onHeartButtonClick, - onCourseItemClick = onCourseItemClick, - handleVisitorMode = handleVisitorMode - ) - } - - DiscoverMultiViewType.RECOMMEND_HEADER.ordinal -> { - DiscoverMultiViewHolder.RecommendHeaderViewHolder( - binding = ItemDiscoverMultiviewRecommendHeaderBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ) - ) - } - - else -> { - DiscoverMultiViewHolder.RecommendCourseViewHolder( - binding = ItemDiscoverMultiviewRecommendCourseBinding.inflate( - LayoutInflater.from(parent.context), - parent, - false - ), - onHeartButtonClick = onHeartButtonClick, - onCourseItemClick = onCourseItemClick, - handleVisitorMode = handleVisitorMode, - ) - } - } + return DiscoverMultiViewHolderFactory().createMultiViewHolder( + parent = parent, + viewType = DiscoverMultiViewType.values()[viewType], + onHeartButtonClick = onHeartButtonClick, + onCourseItemClick = onCourseItemClick, + handleVisitorMode = handleVisitorMode + ) } override fun onBindViewHolder(holder: DiscoverMultiViewHolder, position: Int) { + val currentMultiViewItem = currentList[position] + when (holder) { is DiscoverMultiViewHolder.MarathonCourseViewHolder -> { marathonViewHolder = holder - (currentList[position] as? List)?.let { + (currentMultiViewItem as? List)?.let { holder.bind(it) } } is DiscoverMultiViewHolder.RecommendHeaderViewHolder -> { - (currentList[position] as? List)?.let { + (currentMultiViewItem as? List)?.let { holder.bind(it) } } is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { recommendViewHolder = holder - (currentList[position] as? List)?.let { + (currentMultiViewItem as? List)?.let { holder.bind(it) } } } } - // todo: 추천 코스 헤더 텍스트를 별도의 멀티 뷰 타입으로 분리하자! 팩토리 패턴 적용! - fun loadRecommendCourseNextPage(nextPageCourses: List) { + fun addRecommendCourseNextPage(nextPageCourses: List) { currentList.add(nextPageCourses) notifyItemInserted(itemCount - 1) } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt index 322495ef5..40b37d0de 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt @@ -6,7 +6,6 @@ import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendCourseBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendHeaderBinding -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolderFactory.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolderFactory.kt new file mode 100644 index 000000000..e12fa39d0 --- /dev/null +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolderFactory.kt @@ -0,0 +1,54 @@ +package com.runnect.runnect.presentation.discover.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding +import com.runnect.runnect.R + +class DiscoverMultiViewHolderFactory { + fun createMultiViewHolder( + parent: ViewGroup, + viewType: DiscoverMultiViewType, + onHeartButtonClick: (Int, Boolean) -> Unit, + onCourseItemClick: (Int) -> Unit, + handleVisitorMode: () -> Unit, + ): DiscoverMultiViewHolder { + return when (viewType) { + DiscoverMultiViewType.MARATHON -> { + DiscoverMultiViewHolder.MarathonCourseViewHolder( + binding = getViewBinding(parent, R.layout.item_discover_multiview_marathon), + onHeartButtonClick = onHeartButtonClick, + onCourseItemClick = onCourseItemClick, + handleVisitorMode = handleVisitorMode + ) + } + + DiscoverMultiViewType.RECOMMEND_HEADER -> { + DiscoverMultiViewHolder.RecommendHeaderViewHolder( + binding = getViewBinding(parent, R.layout.item_discover_multiview_recommend_header) + ) + } + + DiscoverMultiViewType.RECOMMEND_COURSE -> { + DiscoverMultiViewHolder.RecommendCourseViewHolder( + binding = getViewBinding(parent, R.layout.item_discover_multiview_recommend_course), + onHeartButtonClick = onHeartButtonClick, + onCourseItemClick = onCourseItemClick, + handleVisitorMode = handleVisitorMode + ) + } + } + } + + private fun getViewBinding( + parent: ViewGroup, + @LayoutRes layoutRes: Int + ): T = DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + layoutRes, + parent, + false + ) +} \ No newline at end of file From 605dc9d882e69f08df81f774844f65ff7e5eac5f Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 14:11:28 +0900 Subject: [PATCH 40/61] =?UTF-8?q?[DEL]=20#297=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=9E=84=ED=8F=AC?= =?UTF-8?q?=ED=8A=B8=EB=AC=B8=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discover/adapter/DiscoverMultiViewAdapter.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt index 9063aa0bc..9a7407632 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt @@ -1,13 +1,11 @@ package com.runnect.runnect.presentation.discover.adapter -import android.view.LayoutInflater import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView -import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding -import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendCourseBinding -import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendHeaderBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendHeader import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse class DiscoverMultiViewAdapter( From b37b5ddca68e3e51964a024a6c8b6259938be367 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 14:20:36 +0900 Subject: [PATCH 41/61] =?UTF-8?q?[CHORE]=20#297=20=EB=A9=80=ED=8B=B0?= =?UTF-8?q?=EB=B7=B0=20=EA=B4=80=EB=A0=A8=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=9D=98=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => multiview}/DiscoverMultiViewAdapter.kt | 2 +- .../{ => multiview}/DiscoverMultiViewHolder.kt | 4 +++- .../DiscoverMultiViewHolderFactory.kt | 12 +++++++++--- .../adapter/{ => multiview}/DiscoverMultiViewType.kt | 2 +- 4 files changed, 14 insertions(+), 6 deletions(-) rename app/src/main/java/com/runnect/runnect/presentation/discover/adapter/{ => multiview}/DiscoverMultiViewAdapter.kt (98%) rename app/src/main/java/com/runnect/runnect/presentation/discover/adapter/{ => multiview}/DiscoverMultiViewHolder.kt (95%) rename app/src/main/java/com/runnect/runnect/presentation/discover/adapter/{ => multiview}/DiscoverMultiViewHolderFactory.kt (80%) rename app/src/main/java/com/runnect/runnect/presentation/discover/adapter/{ => multiview}/DiscoverMultiViewType.kt (58%) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt similarity index 98% rename from app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt rename to app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt index 9a7407632..5de4ab8a6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt @@ -1,4 +1,4 @@ -package com.runnect.runnect.presentation.discover.adapter +package com.runnect.runnect.presentation.discover.adapter.multiview import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt similarity index 95% rename from app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt rename to app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index 40b37d0de..5c3b76d6a 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -1,4 +1,4 @@ -package com.runnect.runnect.presentation.discover.adapter +package com.runnect.runnect.presentation.discover.adapter.multiview import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.GridLayoutManager @@ -7,6 +7,8 @@ import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendCourseBinding import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendHeaderBinding import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* +import com.runnect.runnect.presentation.discover.adapter.DiscoverMarathonAdapter +import com.runnect.runnect.presentation.discover.adapter.DiscoverRecommendAdapter import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolderFactory.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt similarity index 80% rename from app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolderFactory.kt rename to app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt index e12fa39d0..05a2fa21e 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewHolderFactory.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt @@ -1,4 +1,4 @@ -package com.runnect.runnect.presentation.discover.adapter +package com.runnect.runnect.presentation.discover.adapter.multiview import android.view.LayoutInflater import android.view.ViewGroup @@ -27,13 +27,19 @@ class DiscoverMultiViewHolderFactory { DiscoverMultiViewType.RECOMMEND_HEADER -> { DiscoverMultiViewHolder.RecommendHeaderViewHolder( - binding = getViewBinding(parent, R.layout.item_discover_multiview_recommend_header) + binding = getViewBinding( + parent, + R.layout.item_discover_multiview_recommend_header + ) ) } DiscoverMultiViewType.RECOMMEND_COURSE -> { DiscoverMultiViewHolder.RecommendCourseViewHolder( - binding = getViewBinding(parent, R.layout.item_discover_multiview_recommend_course), + binding = getViewBinding( + parent, + R.layout.item_discover_multiview_recommend_course + ), onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewType.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewType.kt similarity index 58% rename from app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewType.kt rename to app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewType.kt index 377d14b37..27c5435e6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/DiscoverMultiViewType.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewType.kt @@ -1,4 +1,4 @@ -package com.runnect.runnect.presentation.discover.adapter +package com.runnect.runnect.presentation.discover.adapter.multiview enum class DiscoverMultiViewType { MARATHON, From 4ab19a1704616b317758056e370bd4b27aa87ffb Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 14:21:01 +0900 Subject: [PATCH 42/61] =?UTF-8?q?[ADD]=20#297=20=EC=8A=A4=EB=82=B5?= =?UTF-8?q?=EB=B0=94=20=EC=9E=84=ED=8F=AC=ED=8A=B8=EB=AC=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index f77961812..699d975ee 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -23,7 +23,7 @@ import com.runnect.runnect.presentation.MainActivity.Companion.isVisitorMode import com.runnect.runnect.presentation.detail.CourseDetailActivity import com.runnect.runnect.presentation.detail.CourseDetailRootScreen import com.runnect.runnect.presentation.discover.adapter.BannerAdapter -import com.runnect.runnect.presentation.discover.adapter.DiscoverMultiViewAdapter +import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewAdapter import com.runnect.runnect.presentation.discover.pick.DiscoverPickActivity import com.runnect.runnect.presentation.discover.search.DiscoverSearchActivity import com.runnect.runnect.presentation.state.UiStateV2 @@ -33,6 +33,7 @@ import com.runnect.runnect.util.extension.applyScreenEnterAnimation import com.runnect.runnect.util.extension.getCompatibleParcelableExtra import com.runnect.runnect.util.extension.navigateToPreviousScreenWithAnimation import com.runnect.runnect.util.extension.showDiscoverSnackbar +import com.runnect.runnect.util.extension.showSnackbar import com.runnect.runnect.util.extension.showWebBrowser import com.runnect.runnect.util.extension.viewLifeCycleScope import dagger.hilt.android.AndroidEntryPoint From ef6f71dfffc4c6d126118f549e818b0f6f7b5801 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 14:48:38 +0900 Subject: [PATCH 43/61] =?UTF-8?q?[CHORE]=20#297=20=EB=A9=80=ED=8B=B0?= =?UTF-8?q?=EB=B7=B0=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=A3=BC=EC=84=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discover/adapter/multiview/DiscoverMultiViewAdapter.kt | 5 ++++- .../discover/adapter/multiview/DiscoverMultiViewHolder.kt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt index 5de4ab8a6..37b34a43c 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt @@ -65,6 +65,7 @@ class DiscoverMultiViewAdapter( } fun addRecommendCourseNextPage(nextPageCourses: List) { + // 외부 리사이클러뷰에 추천 코스 타입의 멀티뷰 아이템 추가 currentList.add(nextPageCourses) notifyItemInserted(itemCount - 1) } @@ -85,12 +86,14 @@ class DiscoverMultiViewAdapter( ) } - else -> { + is RecommendCourse -> { recommendViewHolder.updateRecommendCourseItem( publicCourseId = publicCourseId, updatedCourse = updatedCourse ) } + + else -> {} } } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index 5c3b76d6a..9ba04d417 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -88,7 +88,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } fun bind(courses: List) { - Timber.e("추천 코스 리스트 바인딩!!!") + Timber.e("추천 코스 타입의 멀티뷰 아이템이 바인딩 되었어요! ${courses.size}") initRecommendRecyclerView(courses) } From ccbaa85baecc2553876821fde5c24f307e7825c1 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 16:02:25 +0900 Subject: [PATCH 44/61] =?UTF-8?q?[FIX]=20#297=20=EC=99=B8=EB=B6=80=20?= =?UTF-8?q?=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC=EB=B7=B0=EC=9D=98?= =?UTF-8?q?=20=EC=B6=94=EC=B2=9C=20=EC=BD=94=EC=8A=A4=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EA=B0=B1=EC=8B=A0=20->=20=EB=82=B4=EB=B6=80=20?= =?UTF-8?q?=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC=EB=B7=B0=EC=97=90?= =?UTF-8?q?=20=EC=83=88=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20submitList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../discover/DiscoverViewModel.kt | 2 +- .../multiview/DiscoverMultiViewAdapter.kt | 20 ++++++++++--------- .../multiview/DiscoverMultiViewHolder.kt | 2 +- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index a20d8399d..047e9a508 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -42,7 +42,7 @@ class DiscoverViewModel @Inject constructor( val courseScrapState: LiveData> get() = _courseScrapState - private val _multiViewItems: ArrayList> = arrayListOf() + private val _multiViewItems: MutableList> = mutableListOf() val multiViewItems: List> get() = _multiViewItems private var _clickedCourseId = -1 diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt index 37b34a43c..fc7aa128b 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt @@ -14,7 +14,8 @@ class DiscoverMultiViewAdapter( private val onCourseItemClick: (Int) -> Unit, private val handleVisitorMode: () -> Unit, ) : RecyclerView.Adapter() { - private val currentList = multiViewItems.toMutableList() + private val currentList: List> = + multiViewItems.map { it.toMutableList() } private lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder private lateinit var recommendViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder @@ -39,25 +40,25 @@ class DiscoverMultiViewAdapter( } override fun onBindViewHolder(holder: DiscoverMultiViewHolder, position: Int) { - val currentMultiViewItem = currentList[position] - when (holder) { is DiscoverMultiViewHolder.MarathonCourseViewHolder -> { marathonViewHolder = holder - (currentMultiViewItem as? List)?.let { + (currentList[position] as? List)?.let { holder.bind(it) } } is DiscoverMultiViewHolder.RecommendHeaderViewHolder -> { - (currentMultiViewItem as? List)?.let { + (currentList[position] as? List)?.let { holder.bind(it) } } is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { recommendViewHolder = holder - (currentMultiViewItem as? List)?.let { + + // 외부 리사이클러뷰 notify -> 내부 리사이클러뷰 어댑터에 새 페이지가 추가된 데이터가 전달됨. + (currentList[position] as? List)?.let { holder.bind(it) } } @@ -65,9 +66,10 @@ class DiscoverMultiViewAdapter( } fun addRecommendCourseNextPage(nextPageCourses: List) { - // 외부 리사이클러뷰에 추천 코스 타입의 멀티뷰 아이템 추가 - currentList.add(nextPageCourses) - notifyItemInserted(itemCount - 1) + // 외부 리사이클러뷰의 추천 코스 리스트 갱신 + val recommendPosition = DiscoverMultiViewType.RECOMMEND_COURSE.ordinal + currentList[recommendPosition].addAll(nextPageCourses) + notifyItemChanged(recommendPosition) } fun updateCourseItem( diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index 9ba04d417..ace2b8e25 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -88,7 +88,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } fun bind(courses: List) { - Timber.e("추천 코스 타입의 멀티뷰 아이템이 바인딩 되었어요! ${courses.size}") + Timber.e("추천 코스 리스트 크기: ${courses.size}") initRecommendRecyclerView(courses) } From 7eb0ffada468a6197d559a3096d08fba0a9be45d Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 16:56:45 +0900 Subject: [PATCH 45/61] =?UTF-8?q?[FIX]=20#297=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EC=97=90=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8D=98=20=EA=B7=B8?= =?UTF-8?q?=EB=A6=AC=EB=93=9C=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=BD=94=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/multiview/DiscoverMultiViewHolder.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index ace2b8e25..8e154d2d7 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -12,6 +12,7 @@ import com.runnect.runnect.presentation.discover.adapter.DiscoverRecommendAdapte import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration +import com.runnect.runnect.util.custom.deco.GridSpacingItemDecoration import timber.log.Timber sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : @@ -109,11 +110,11 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : removeItemDecorationAt(0) } addItemDecoration( - DiscoverRecommendItemDecoration( + GridSpacingItemDecoration( context = context, - rightSpacing = 6, - bottomSpacing = 20, - spanCount = 2 + spanCount = 2, + horizontalSpaceSize = 6, + topSpaceSize = 20 ) ) } From 613e0521fc28c1d7a44a39dc2d7121703018109c Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 17:16:19 +0900 Subject: [PATCH 46/61] =?UTF-8?q?[REFACTOR]=20#297=20=EB=A7=88=EB=9D=BC?= =?UTF-8?q?=ED=86=A4,=20=EC=B6=94=EC=B2=9C=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EB=B7=B0=ED=99=80=EB=8D=94=EB=A5=BC=20=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=EB=A1=9C=EB=B6=80=ED=84=B0=20=EC=B0=B8=EC=A1=B0?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=ED=95=98?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/multiview/DiscoverMultiViewAdapter.kt | 12 ++++-------- .../multiview/DiscoverMultiViewHolderFactory.kt | 13 +++++++++---- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt index fc7aa128b..abedbf40a 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt @@ -14,10 +14,9 @@ class DiscoverMultiViewAdapter( private val onCourseItemClick: (Int) -> Unit, private val handleVisitorMode: () -> Unit, ) : RecyclerView.Adapter() { + private val multiViewHolderFactory by lazy { DiscoverMultiViewHolderFactory() } private val currentList: List> = multiViewItems.map { it.toMutableList() } - private lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder - private lateinit var recommendViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder override fun getItemViewType(position: Int): Int { return when (currentList[position].first()) { @@ -30,7 +29,7 @@ class DiscoverMultiViewAdapter( override fun getItemCount(): Int = currentList.size override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DiscoverMultiViewHolder { - return DiscoverMultiViewHolderFactory().createMultiViewHolder( + return multiViewHolderFactory.createMultiViewHolder( parent = parent, viewType = DiscoverMultiViewType.values()[viewType], onHeartButtonClick = onHeartButtonClick, @@ -42,7 +41,6 @@ class DiscoverMultiViewAdapter( override fun onBindViewHolder(holder: DiscoverMultiViewHolder, position: Int) { when (holder) { is DiscoverMultiViewHolder.MarathonCourseViewHolder -> { - marathonViewHolder = holder (currentList[position] as? List)?.let { holder.bind(it) } @@ -55,8 +53,6 @@ class DiscoverMultiViewAdapter( } is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { - recommendViewHolder = holder - // 외부 리사이클러뷰 notify -> 내부 리사이클러뷰 어댑터에 새 페이지가 추가된 데이터가 전달됨. (currentList[position] as? List)?.let { holder.bind(it) @@ -82,14 +78,14 @@ class DiscoverMultiViewAdapter( when (targetItem) { is MarathonCourse -> { - marathonViewHolder.updateMarathonCourseItem( + multiViewHolderFactory.marathonViewHolder.updateMarathonCourseItem( publicCourseId = publicCourseId, updatedCourse = updatedCourse ) } is RecommendCourse -> { - recommendViewHolder.updateRecommendCourseItem( + multiViewHolderFactory.recommendCourseViewHolder.updateRecommendCourseItem( publicCourseId = publicCourseId, updatedCourse = updatedCourse ) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt index 05a2fa21e..75aac5b66 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt @@ -8,6 +8,9 @@ import androidx.databinding.ViewDataBinding import com.runnect.runnect.R class DiscoverMultiViewHolderFactory { + lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder + lateinit var recommendCourseViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder + fun createMultiViewHolder( parent: ViewGroup, viewType: DiscoverMultiViewType, @@ -15,18 +18,19 @@ class DiscoverMultiViewHolderFactory { onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit, ): DiscoverMultiViewHolder { - return when (viewType) { + when (viewType) { DiscoverMultiViewType.MARATHON -> { - DiscoverMultiViewHolder.MarathonCourseViewHolder( + marathonViewHolder = DiscoverMultiViewHolder.MarathonCourseViewHolder( binding = getViewBinding(parent, R.layout.item_discover_multiview_marathon), onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode ) + return marathonViewHolder } DiscoverMultiViewType.RECOMMEND_HEADER -> { - DiscoverMultiViewHolder.RecommendHeaderViewHolder( + return DiscoverMultiViewHolder.RecommendHeaderViewHolder( binding = getViewBinding( parent, R.layout.item_discover_multiview_recommend_header @@ -35,7 +39,7 @@ class DiscoverMultiViewHolderFactory { } DiscoverMultiViewType.RECOMMEND_COURSE -> { - DiscoverMultiViewHolder.RecommendCourseViewHolder( + recommendCourseViewHolder = DiscoverMultiViewHolder.RecommendCourseViewHolder( binding = getViewBinding( parent, R.layout.item_discover_multiview_recommend_course @@ -44,6 +48,7 @@ class DiscoverMultiViewHolderFactory { onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode ) + return recommendCourseViewHolder } } } From d37246c9ce42bd67ee5f7e3f78e6577b55b42728 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 20 Dec 2023 20:03:27 +0900 Subject: [PATCH 47/61] =?UTF-8?q?[CHORE]=20#297=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=ED=95=9C=20=EC=BD=94=EB=93=9C=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?=EC=84=A4=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/presentation/discover/DiscoverViewModel.kt | 5 ++++- .../discover/adapter/multiview/DiscoverMultiViewAdapter.kt | 3 +-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index 047e9a508..b6773ff5e 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -136,7 +136,9 @@ class DiscoverViewModel @Inject constructor( if (isRecommendCoursePageEnd) return@launch Timber.e("다음 페이지를 요청했어요!") + _nextPageState.value = UiStateV2.Loading currentPageNo++ + courseRepository.getRecommendCourse( pageNo = currentPageNo.toString(), ordering = "date" @@ -158,6 +160,7 @@ class DiscoverViewModel @Inject constructor( } } + // todo: 동기 처리 로직 수정 필요 (간헐적으로 무한 로딩 상태에 빠짐) fun checkCourseLoadState(): Boolean { return marathonCourseState.value is UiStateV2.Success && recommendCourseState.value is UiStateV2.Success && @@ -181,6 +184,6 @@ class DiscoverViewModel @Inject constructor( } companion object { - private const val MULTI_VIEW_TYPE_SIZE = 2 + private const val MULTI_VIEW_TYPE_SIZE = 3 } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt index abedbf40a..6fb3be569 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt @@ -53,7 +53,6 @@ class DiscoverMultiViewAdapter( } is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { - // 외부 리사이클러뷰 notify -> 내부 리사이클러뷰 어댑터에 새 페이지가 추가된 데이터가 전달됨. (currentList[position] as? List)?.let { holder.bind(it) } @@ -62,7 +61,7 @@ class DiscoverMultiViewAdapter( } fun addRecommendCourseNextPage(nextPageCourses: List) { - // 외부 리사이클러뷰의 추천 코스 리스트 갱신 + // 외부 리사이클러뷰의 추천 코스 리스트 갱신 -> 내부 리사이클러뷰 재바인딩 -> 새로운 데이터 submitList val recommendPosition = DiscoverMultiViewType.RECOMMEND_COURSE.ordinal currentList[recommendPosition].addAll(nextPageCourses) notifyItemChanged(recommendPosition) From b6176906b1496b6df7df421da67c64c414bdc4fe Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 26 Dec 2023 19:08:26 +0900 Subject: [PATCH 48/61] =?UTF-8?q?[REFACTOR]=20#297=20=EC=BD=94=EC=8A=A4=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EA=B0=B1=EC=8B=A0=20=EC=8B=9C,?= =?UTF-8?q?=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20=EB=B0=98=EB=B3=B5?= =?UTF-8?q?=EB=AC=B8=20=EC=97=B0=EC=82=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../multiview/DiscoverMultiViewAdapter.kt | 8 ++++-- .../multiview/DiscoverMultiViewHolder.kt | 26 +++++++------------ 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt index 6fb3be569..bc4cb3582 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt @@ -77,15 +77,19 @@ class DiscoverMultiViewAdapter( when (targetItem) { is MarathonCourse -> { + val position = DiscoverMultiViewType.MARATHON.ordinal + val targetIndex = currentList[position].indexOf(targetItem) multiViewHolderFactory.marathonViewHolder.updateMarathonCourseItem( - publicCourseId = publicCourseId, + targetIndex = targetIndex, updatedCourse = updatedCourse ) } is RecommendCourse -> { + val position = DiscoverMultiViewType.RECOMMEND_COURSE.ordinal + val targetIndex = currentList[position].indexOf(targetItem) multiViewHolderFactory.recommendCourseViewHolder.updateRecommendCourseItem( - publicCourseId = publicCourseId, + targetIndex = targetIndex, updatedCourse = updatedCourse ) } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index 8e154d2d7..d9d27cf74 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -51,17 +51,14 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } fun updateMarathonCourseItem( - publicCourseId: Int, + targetIndex: Int, updatedCourse: EditableDiscoverCourse ) { - marathonAdapter.currentList.forEachIndexed { index, course -> - if (course.id == publicCourseId) { - course.title = updatedCourse.title - course.scrap = updatedCourse.scrap - marathonAdapter.notifyItemChanged(index) - return@forEachIndexed - } + marathonAdapter.currentList[targetIndex].apply { + title = updatedCourse.title + scrap = updatedCourse.scrap } + marathonAdapter.notifyItemChanged(targetIndex) } } @@ -121,17 +118,14 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } fun updateRecommendCourseItem( - publicCourseId: Int, + targetIndex: Int, updatedCourse: EditableDiscoverCourse ) { - recommendAdapter.currentList.forEachIndexed { index, course -> - if (course.id == publicCourseId) { - course.title = updatedCourse.title - course.scrap = updatedCourse.scrap - recommendAdapter.notifyItemChanged(index) - return@forEachIndexed - } + recommendAdapter.currentList[targetIndex].apply { + title = updatedCourse.title + scrap = updatedCourse.scrap } + recommendAdapter.notifyItemChanged(targetIndex) } } } From 295a7b36295f47c8b61776473d06bb111223722b Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 26 Dec 2023 19:46:01 +0900 Subject: [PATCH 49/61] =?UTF-8?q?[DEL]=20#297=20=EC=99=B8=EB=B6=80=20?= =?UTF-8?q?=EB=A6=AC=EC=82=AC=EC=9D=B4=ED=81=B4=EB=9F=AC=EB=B7=B0=EC=9D=98?= =?UTF-8?q?=20=EB=A9=80=ED=8B=B0=20=EB=B7=B0=20=ED=83=80=EC=9E=85=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=B6=94=EC=B2=9C=20=EC=BD=94=EC=8A=A4=20=ED=97=A4?= =?UTF-8?q?=EB=8D=94=20=ED=83=80=EC=9E=85=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - notifyItemInserted 대신에 notifyItemChanged 함수를 사용하기 때문에, 추천 코스의 헤더와 리스트 영역을 구분할 필요가 없어짐. --- .../domain/entity/DiscoverMultiViewItem.kt | 9 ----- .../presentation/discover/DiscoverFragment.kt | 12 ------- .../discover/DiscoverViewModel.kt | 6 +--- .../multiview/DiscoverMultiViewAdapter.kt | 22 ++++--------- .../multiview/DiscoverMultiViewHolder.kt | 18 +++------- .../DiscoverMultiViewHolderFactory.kt | 19 +++-------- .../multiview/DiscoverMultiViewType.kt | 3 +- ... => item_discover_multiview_recommend.xml} | 33 +++++++++++-------- ...em_discover_multiview_recommend_course.xml | 27 --------------- 9 files changed, 37 insertions(+), 112 deletions(-) rename app/src/main/res/layout/{item_discover_multiview_recommend_header.xml => item_discover_multiview_recommend.xml} (79%) delete mode 100644 app/src/main/res/layout/item_discover_multiview_recommend_course.xml diff --git a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt index d16132a14..9e1c9600c 100644 --- a/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt +++ b/app/src/main/java/com/runnect/runnect/domain/entity/DiscoverMultiViewItem.kt @@ -12,11 +12,6 @@ sealed class DiscoverMultiViewItem( val departure: String, ) : DiscoverMultiViewItem(id) - data class RecommendHeader( - val title: String, - val subtitle: String - ) : DiscoverMultiViewItem(HEADER_ID) - data class RecommendCourse( override val id: Int, val courseId: Int, @@ -25,8 +20,4 @@ sealed class DiscoverMultiViewItem( var scrap: Boolean, val departure: String, ) : DiscoverMultiViewItem(id) - - companion object { - private const val HEADER_ID = -1 - } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 699d975ee..635919571 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -283,10 +283,6 @@ class DiscoverFragment : BindingFragment(R.layout.fragm when (state) { is UiStateV2.Loading -> showLoadingProgressBar() - is UiStateV2.Success -> { - addRecommendHeaderView() - } - is UiStateV2.Failure -> { dismissLoadingProgressBar() context?.showDiscoverSnackbar(binding.root, state.msg) @@ -297,14 +293,6 @@ class DiscoverFragment : BindingFragment(R.layout.fragm } } - private fun addRecommendHeaderView() { - val header = DiscoverMultiViewItem.RecommendHeader( - title = getString(R.string.discover_recommend_header_title), - subtitle = getString(R.string.discover_marathon_header_subtitle) - ) - viewModel.addRecommendHeaderView(listOf(header)) - } - private fun setupRecommendCourseGetStateObserver() { viewModel.recommendCourseState.observe(viewLifecycleOwner) { state -> when (state) { diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index b6773ff5e..ffbccab96 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -104,10 +104,6 @@ class DiscoverViewModel @Inject constructor( } } - fun addRecommendHeaderView(headers: List) { - _multiViewItems.add(headers) - } - fun getRecommendCourse(pageNo: Int, ordering: String) { viewModelScope.launch { _recommendCourseState.value = UiStateV2.Loading @@ -184,6 +180,6 @@ class DiscoverViewModel @Inject constructor( } companion object { - private const val MULTI_VIEW_TYPE_SIZE = 3 + private const val MULTI_VIEW_TYPE_SIZE = 2 } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt index bc4cb3582..43326e011 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewAdapter.kt @@ -5,7 +5,6 @@ import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendHeader import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse class DiscoverMultiViewAdapter( @@ -21,8 +20,7 @@ class DiscoverMultiViewAdapter( override fun getItemViewType(position: Int): Int { return when (currentList[position].first()) { is MarathonCourse -> DiscoverMultiViewType.MARATHON.ordinal - is RecommendHeader -> DiscoverMultiViewType.RECOMMEND_HEADER.ordinal - is RecommendCourse -> DiscoverMultiViewType.RECOMMEND_COURSE.ordinal + is RecommendCourse -> DiscoverMultiViewType.RECOMMEND.ordinal } } @@ -46,12 +44,6 @@ class DiscoverMultiViewAdapter( } } - is DiscoverMultiViewHolder.RecommendHeaderViewHolder -> { - (currentList[position] as? List)?.let { - holder.bind(it) - } - } - is DiscoverMultiViewHolder.RecommendCourseViewHolder -> { (currentList[position] as? List)?.let { holder.bind(it) @@ -62,9 +54,9 @@ class DiscoverMultiViewAdapter( fun addRecommendCourseNextPage(nextPageCourses: List) { // 외부 리사이클러뷰의 추천 코스 리스트 갱신 -> 내부 리사이클러뷰 재바인딩 -> 새로운 데이터 submitList - val recommendPosition = DiscoverMultiViewType.RECOMMEND_COURSE.ordinal - currentList[recommendPosition].addAll(nextPageCourses) - notifyItemChanged(recommendPosition) + val position = DiscoverMultiViewType.RECOMMEND.ordinal + currentList[position].addAll(nextPageCourses) + notifyItemChanged(position) } fun updateCourseItem( @@ -86,15 +78,13 @@ class DiscoverMultiViewAdapter( } is RecommendCourse -> { - val position = DiscoverMultiViewType.RECOMMEND_COURSE.ordinal + val position = DiscoverMultiViewType.RECOMMEND.ordinal val targetIndex = currentList[position].indexOf(targetItem) - multiViewHolderFactory.recommendCourseViewHolder.updateRecommendCourseItem( + multiViewHolderFactory.recommendViewHolder.updateRecommendCourseItem( targetIndex = targetIndex, updatedCourse = updatedCourse ) } - - else -> {} } } } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index d9d27cf74..676916024 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -4,14 +4,13 @@ import androidx.databinding.ViewDataBinding import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.runnect.runnect.databinding.ItemDiscoverMultiviewMarathonBinding -import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendCourseBinding -import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendHeaderBinding -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* +import com.runnect.runnect.databinding.ItemDiscoverMultiviewRecommendBinding +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.MarathonCourse +import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.RecommendCourse import com.runnect.runnect.presentation.discover.adapter.DiscoverMarathonAdapter import com.runnect.runnect.presentation.discover.adapter.DiscoverRecommendAdapter import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration -import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration import com.runnect.runnect.util.custom.deco.GridSpacingItemDecoration import timber.log.Timber @@ -62,17 +61,8 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } } - // todo: 정렬 버튼 클릭 리스너 구현 - class RecommendHeaderViewHolder( - private val binding: ItemDiscoverMultiviewRecommendHeaderBinding - ) : DiscoverMultiViewHolder(binding) { - fun bind(headers: List) { - binding.header = headers.first() - } - } - class RecommendCourseViewHolder( - private val binding: ItemDiscoverMultiviewRecommendCourseBinding, + private val binding: ItemDiscoverMultiviewRecommendBinding, onHeartButtonClick: (Int, Boolean) -> Unit, onCourseItemClick: (Int) -> Unit, handleVisitorMode: () -> Unit, diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt index 75aac5b66..4ffbe2862 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt @@ -9,7 +9,7 @@ import com.runnect.runnect.R class DiscoverMultiViewHolderFactory { lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder - lateinit var recommendCourseViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder + lateinit var recommendViewHolder: DiscoverMultiViewHolder.RecommendCourseViewHolder fun createMultiViewHolder( parent: ViewGroup, @@ -29,26 +29,17 @@ class DiscoverMultiViewHolderFactory { return marathonViewHolder } - DiscoverMultiViewType.RECOMMEND_HEADER -> { - return DiscoverMultiViewHolder.RecommendHeaderViewHolder( + DiscoverMultiViewType.RECOMMEND -> { + recommendViewHolder = DiscoverMultiViewHolder.RecommendCourseViewHolder( binding = getViewBinding( parent, - R.layout.item_discover_multiview_recommend_header - ) - ) - } - - DiscoverMultiViewType.RECOMMEND_COURSE -> { - recommendCourseViewHolder = DiscoverMultiViewHolder.RecommendCourseViewHolder( - binding = getViewBinding( - parent, - R.layout.item_discover_multiview_recommend_course + R.layout.item_discover_multiview_recommend ), onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode ) - return recommendCourseViewHolder + return recommendViewHolder } } } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewType.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewType.kt index 27c5435e6..75a517a51 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewType.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewType.kt @@ -2,6 +2,5 @@ package com.runnect.runnect.presentation.discover.adapter.multiview enum class DiscoverMultiViewType { MARATHON, - RECOMMEND_HEADER, - RECOMMEND_COURSE + RECOMMEND } diff --git a/app/src/main/res/layout/item_discover_multiview_recommend_header.xml b/app/src/main/res/layout/item_discover_multiview_recommend.xml similarity index 79% rename from app/src/main/res/layout/item_discover_multiview_recommend_header.xml rename to app/src/main/res/layout/item_discover_multiview_recommend.xml index 9cde9fdae..a6ac7bedf 100644 --- a/app/src/main/res/layout/item_discover_multiview_recommend_header.xml +++ b/app/src/main/res/layout/item_discover_multiview_recommend.xml @@ -3,13 +3,6 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> - - - - - @@ -40,12 +33,11 @@ android:layout_marginStart="15dp" android:layout_marginTop="34dp" android:fontFamily="@font/pretendard_bold" - android:text="@{header.title}" + android:text="@string/discover_recommend_header_title" android:textColor="@color/G1" android:textSize="18sp" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintTop_toTopOf="parent" - tools:text="@string/discover_recommend_header_title" /> + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@id/tv_discover_recommend_title" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_discover_multiview_recommend_course.xml b/app/src/main/res/layout/item_discover_multiview_recommend_course.xml deleted file mode 100644 index bf62bf6ae..000000000 --- a/app/src/main/res/layout/item_discover_multiview_recommend_course.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - \ No newline at end of file From 140956a099f84eb176b98d5e20ba637eb8bdbbbb Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 26 Dec 2023 19:48:54 +0900 Subject: [PATCH 50/61] =?UTF-8?q?[MOD]=20#297=20=EB=A9=80=ED=8B=B0?= =?UTF-8?q?=EB=B7=B0=20=ED=83=80=EC=9E=85=EC=9D=98=20=EA=B0=9C=EC=88=98?= =?UTF-8?q?=EB=A5=BC=20=EC=83=81=EC=88=98=EB=A1=9C=20=EC=A0=95=EC=9D=98?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EA=B3=A0,=20=EC=9D=B4=EB=84=98?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=9E=90=EC=8B=9D=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=EB=A1=9C=20=EC=B0=B8=EC=A1=B0=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/presentation/discover/DiscoverViewModel.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index ffbccab96..9c03dc274 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -10,6 +10,8 @@ import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.domain.entity.DiscoverBanner import com.runnect.runnect.domain.repository.BannerRepository import com.runnect.runnect.domain.repository.CourseRepository +import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewHolder +import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewType import com.runnect.runnect.presentation.state.UiStateV2 import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.catch @@ -160,7 +162,7 @@ class DiscoverViewModel @Inject constructor( fun checkCourseLoadState(): Boolean { return marathonCourseState.value is UiStateV2.Success && recommendCourseState.value is UiStateV2.Success && - multiViewItems.size >= MULTI_VIEW_TYPE_SIZE + multiViewItems.size >= DiscoverMultiViewType.values().size } fun postCourseScrap(id: Int, scrapTF: Boolean) { @@ -178,8 +180,4 @@ class DiscoverViewModel @Inject constructor( } } } - - companion object { - private const val MULTI_VIEW_TYPE_SIZE = 2 - } } \ No newline at end of file From 6ee12e14dc783434bee10123d96df0fba67e4f54 Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 26 Dec 2023 20:05:10 +0900 Subject: [PATCH 51/61] =?UTF-8?q?[REFACTOR]=20#297=20=EC=8A=A4=EB=82=B5?= =?UTF-8?q?=EB=B0=94=20=EB=9D=84=EC=9A=B0=EB=8A=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 인자로 gravity 전달하도록 변경 - CoordinatorLayout 사용하는 코스 발견 페이지에서만 스낵바가 상단에 뜨도록 --- .../presentation/discover/DiscoverFragment.kt | 12 +++++----- .../runnect/util/extension/ContextExt.kt | 22 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 635919571..57009a5f6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle +import android.view.Gravity import android.view.View import androidx.activity.OnBackPressedCallback import androidx.activity.result.contract.ActivityResultContracts @@ -32,7 +33,6 @@ import com.runnect.runnect.util.custom.toast.RunnectToast import com.runnect.runnect.util.extension.applyScreenEnterAnimation import com.runnect.runnect.util.extension.getCompatibleParcelableExtra import com.runnect.runnect.util.extension.navigateToPreviousScreenWithAnimation -import com.runnect.runnect.util.extension.showDiscoverSnackbar import com.runnect.runnect.util.extension.showSnackbar import com.runnect.runnect.util.extension.showWebBrowser import com.runnect.runnect.util.extension.viewLifeCycleScope @@ -235,7 +235,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm } is UiStateV2.Failure -> { - context?.showDiscoverSnackbar(binding.root, state.msg) + context?.showSnackbar(binding.root, state.msg, Gravity.TOP) } else -> {} @@ -285,7 +285,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm is UiStateV2.Failure -> { dismissLoadingProgressBar() - context?.showDiscoverSnackbar(binding.root, state.msg) + context?.showSnackbar(binding.root, state.msg, Gravity.TOP) } else -> {} @@ -308,7 +308,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm is UiStateV2.Failure -> { dismissLoadingProgressBar() - context?.showDiscoverSnackbar(binding.root, state.msg) + context?.showSnackbar(binding.root, state.msg, Gravity.TOP) } else -> {} @@ -375,7 +375,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm } is UiStateV2.Failure -> { - context?.showSnackbar(binding.root, state.msg) + context?.showSnackbar(binding.root, state.msg, Gravity.TOP) } else -> {} @@ -386,7 +386,7 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun setupCourseScrapStateObserver() { viewModel.courseScrapState.observe(viewLifecycleOwner) { state -> if (state is UiStateV2.Failure) { - context?.showDiscoverSnackbar(binding.root, state.msg) + context?.showSnackbar(binding.root, state.msg, Gravity.TOP) } } } diff --git a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt index e555d1af2..d1b4a52b3 100644 --- a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt +++ b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt @@ -10,11 +10,9 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.inputmethod.InputMethodManager -import android.widget.FrameLayout import android.widget.Toast import androidx.annotation.ColorRes import androidx.annotation.DrawableRes -import androidx.annotation.StringRes import androidx.appcompat.widget.AppCompatButton import androidx.appcompat.widget.LinearLayoutCompat import androidx.coordinatorlayout.widget.CoordinatorLayout @@ -30,7 +28,6 @@ import kotlinx.android.synthetic.main.custom_dialog_delete.view.tv_dialog import kotlinx.android.synthetic.main.custom_dialog_edit_mode.layout_delete_frame import kotlinx.android.synthetic.main.custom_dialog_edit_mode.layout_edit_frame import kotlinx.android.synthetic.main.fragment_bottom_sheet.btn_delete_yes -import kotlinx.android.synthetic.main.fragment_require_login_dialog.view.tv_require_login_dialog_desc fun Context.setActivityDialog( layoutInflater: LayoutInflater, @@ -171,16 +168,17 @@ fun Context.showToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } -fun Context.showSnackbar(anchorView: View, message: String) { - Snackbar.make(anchorView, message, Snackbar.LENGTH_SHORT).show() -} - -fun Context.showDiscoverSnackbar(anchorView: View, message: String) { +fun Context.showSnackbar(anchorView: View, message: String, gravity: Int = 0) { val snackbar = Snackbar.make(anchorView, message, Snackbar.LENGTH_SHORT) - val params = snackbar.view.layoutParams as CoordinatorLayout.LayoutParams - params.anchorGravity = Gravity.TOP - params.gravity = Gravity.TOP - snackbar.view.layoutParams = params + + if (gravity != 0) { + val layoutParams = snackbar.view.layoutParams as CoordinatorLayout.LayoutParams + layoutParams.apply { + this.gravity = gravity + snackbar.view.layoutParams = this + } + } + snackbar.show() } From d889bc177b309e4367273d2fff303bfc58117aac Mon Sep 17 00:00:00 2001 From: leeeha Date: Tue, 26 Dec 2023 20:26:26 +0900 Subject: [PATCH 52/61] =?UTF-8?q?[FIX]=20#297=20=EB=8B=A4=EC=9D=8C=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A1=9C=EB=94=A9=20=EC=A4=91?= =?UTF-8?q?=EC=9D=BC=20=EB=95=8C=EB=8A=94=20=EC=A4=91=EB=B3=B5=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20=EC=84=9C=EB=B2=84=20=EC=9A=94=EC=B2=AD=20=EB=B3=B4?= =?UTF-8?q?=EB=82=B4=EC=A7=80=20=EC=95=8A=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverFragment.kt | 19 ++++++++++++++----- .../discover/DiscoverViewModel.kt | 3 ++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index 57009a5f6..eee4856a8 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -17,7 +17,6 @@ import com.runnect.runnect.R import com.runnect.runnect.binding.BindingFragment import com.runnect.runnect.databinding.FragmentDiscoverBinding import com.runnect.runnect.domain.entity.DiscoverBanner -import com.runnect.runnect.domain.entity.DiscoverMultiViewItem import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.presentation.MainActivity import com.runnect.runnect.presentation.MainActivity.Companion.isVisitorMode @@ -150,14 +149,24 @@ class DiscoverFragment : BindingFragment(R.layout.fragm val isScrollDown = dy > 0 if (isScrollDown) showCircleUploadButton() - if (!recyclerView.canScrollVertically(SCROLL_DIRECTION)) { - Timber.e("스크롤이 끝에 도달했어요!") - viewModel.getRecommendCourseNextPage() - } + checkNextPageLoadingCondition(recyclerView) } }) } + private fun checkNextPageLoadingCondition(recyclerView: RecyclerView) { + if (!recyclerView.canScrollVertically(SCROLL_DIRECTION)) { + Timber.e("스크롤이 끝에 도달했어요!") + + if (viewModel.isNextPageLoading()) { + Timber.e("다음 페이지 로딩 중입니다.") + return + } + + viewModel.getRecommendCourseNextPage() + } + } + private fun showCircleUploadButton() { binding.fabDiscoverUploadText.isVisible = false binding.fabDiscoverUpload.isVisible = true diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index 9c03dc274..079bcabbc 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -10,7 +10,6 @@ import com.runnect.runnect.domain.entity.DiscoverMultiViewItem.* import com.runnect.runnect.domain.entity.DiscoverBanner import com.runnect.runnect.domain.repository.BannerRepository import com.runnect.runnect.domain.repository.CourseRepository -import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewHolder import com.runnect.runnect.presentation.discover.adapter.multiview.DiscoverMultiViewType import com.runnect.runnect.presentation.state.UiStateV2 import dagger.hilt.android.lifecycle.HiltViewModel @@ -129,6 +128,8 @@ class DiscoverViewModel @Inject constructor( } } + fun isNextPageLoading() = nextPageState.value is UiStateV2.Loading + fun getRecommendCourseNextPage() { viewModelScope.launch { if (isRecommendCoursePageEnd) return@launch From e21ab14f4ff4baa389cb9c835e5b7fae05fdaff8 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 27 Dec 2023 00:22:58 +0900 Subject: [PATCH 53/61] =?UTF-8?q?[FIX]=20#297=20=EA=B7=B8=EB=A6=AC?= =?UTF-8?q?=EB=93=9C=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=8D=B0=EC=BD=94?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=85=98=20=EC=BD=94=EB=93=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 어떤 칼럼이든 오른쪽 여백 추가하도록 --- .../adapter/multiview/DiscoverMultiViewHolder.kt | 8 ++++---- .../deco/DiscoverRecommendItemDecoration.kt | 15 ++------------- .../layout/item_discover_multiview_recommend.xml | 3 ++- 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index 676916024..fc1373716 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -11,6 +11,7 @@ import com.runnect.runnect.presentation.discover.adapter.DiscoverMarathonAdapter import com.runnect.runnect.presentation.discover.adapter.DiscoverRecommendAdapter import com.runnect.runnect.presentation.discover.model.EditableDiscoverCourse import com.runnect.runnect.util.custom.deco.DiscoverMarathonItemDecoration +import com.runnect.runnect.util.custom.deco.DiscoverRecommendItemDecoration import com.runnect.runnect.util.custom.deco.GridSpacingItemDecoration import timber.log.Timber @@ -97,11 +98,10 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : removeItemDecorationAt(0) } addItemDecoration( - GridSpacingItemDecoration( + DiscoverRecommendItemDecoration( context = context, - spanCount = 2, - horizontalSpaceSize = 6, - topSpaceSize = 20 + rightSpacing = 6, + bottomSpacing = 20 ) ) } diff --git a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt index 547105ce5..0e30106ad 100644 --- a/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt +++ b/app/src/main/java/com/runnect/runnect/util/custom/deco/DiscoverRecommendItemDecoration.kt @@ -10,8 +10,7 @@ import timber.log.Timber class DiscoverRecommendItemDecoration( context: Context, rightSpacing: Int, - bottomSpacing: Int, - private val spanCount: Int + bottomSpacing: Int ) : RecyclerView.ItemDecoration() { private val rightSpacingPx = rightSpacing.dpToPx(context) private val bottomSpacingPx = bottomSpacing.dpToPx(context) @@ -22,17 +21,7 @@ class DiscoverRecommendItemDecoration( parent: RecyclerView, state: RecyclerView.State ) { - // 마지막 열 제외하고는 오른쪽 마진 추가 - if (!isLastColumn(view, parent)) { - outRect.right = rightSpacingPx - } - - // 모든 아이템에 대해서 아래쪽 마진 추가 + outRect.right = rightSpacingPx outRect.bottom = bottomSpacingPx } - - private fun isLastColumn(view: View, parent: RecyclerView): Boolean { - val currentItemPosition = parent.getChildAdapterPosition(view) - return currentItemPosition % spanCount == spanCount - 1 - } } diff --git a/app/src/main/res/layout/item_discover_multiview_recommend.xml b/app/src/main/res/layout/item_discover_multiview_recommend.xml index a6ac7bedf..2660ae8bc 100644 --- a/app/src/main/res/layout/item_discover_multiview_recommend.xml +++ b/app/src/main/res/layout/item_discover_multiview_recommend.xml @@ -88,7 +88,8 @@ android:id="@+id/rv_discover_recommend" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginHorizontal="15dp" + android:layout_marginStart="15dp" + android:layout_marginEnd="9dp" android:layout_marginTop="15dp" android:clipToPadding="false" android:nestedScrollingEnabled="false" From d21b9bc7841b953fa8dccbddb9ef891519176c35 Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 27 Dec 2023 00:23:22 +0900 Subject: [PATCH 54/61] =?UTF-8?q?[UI]=20#297=20=EB=A7=88=EB=9D=BC=ED=86=A4?= =?UTF-8?q?,=20=EC=B6=94=EC=B2=9C=EC=BD=94=EC=8A=A4=20=EB=B7=B0=20?= =?UTF-8?q?=EB=94=94=ED=85=8C=EC=9D=BC=20=EC=9E=91=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/layout/item_discover_marathon.xml | 15 ++++++++------- .../main/res/layout/item_discover_recommend.xml | 7 ++++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/main/res/layout/item_discover_marathon.xml b/app/src/main/res/layout/item_discover_marathon.xml index a1ebdca1f..3694ecca3 100644 --- a/app/src/main/res/layout/item_discover_marathon.xml +++ b/app/src/main/res/layout/item_discover_marathon.xml @@ -21,17 +21,17 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" - app:scale_base_height="157" - app:scale_base_width="162"> + app:scale_base_height="160" + app:scale_base_width="156"> + app:scale_height="111" + app:scale_width="156"> Date: Sat, 30 Dec 2023 22:29:34 +0900 Subject: [PATCH 55/61] =?UTF-8?q?[REFACTOR]=20#297=20=EC=8A=A4=EB=82=B5?= =?UTF-8?q?=EB=B0=94=20=EB=9D=84=EC=9A=B0=EB=8A=94=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=ED=95=A0=20=EB=95=8C,=20named=20argument=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presentation/discover/DiscoverFragment.kt | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index eee4856a8..a34a88523 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -244,7 +244,11 @@ class DiscoverFragment : BindingFragment(R.layout.fragm } is UiStateV2.Failure -> { - context?.showSnackbar(binding.root, state.msg, Gravity.TOP) + context?.showSnackbar( + anchorView = binding.root, + message = state.msg, + gravity = Gravity.TOP + ) } else -> {} @@ -294,7 +298,11 @@ class DiscoverFragment : BindingFragment(R.layout.fragm is UiStateV2.Failure -> { dismissLoadingProgressBar() - context?.showSnackbar(binding.root, state.msg, Gravity.TOP) + context?.showSnackbar( + anchorView = binding.root, + message = state.msg, + gravity = Gravity.TOP + ) } else -> {} @@ -317,7 +325,11 @@ class DiscoverFragment : BindingFragment(R.layout.fragm is UiStateV2.Failure -> { dismissLoadingProgressBar() - context?.showSnackbar(binding.root, state.msg, Gravity.TOP) + context?.showSnackbar( + anchorView = binding.root, + message = state.msg, + gravity = Gravity.TOP + ) } else -> {} @@ -384,7 +396,11 @@ class DiscoverFragment : BindingFragment(R.layout.fragm } is UiStateV2.Failure -> { - context?.showSnackbar(binding.root, state.msg, Gravity.TOP) + context?.showSnackbar( + anchorView = binding.root, + message = state.msg, + gravity = Gravity.TOP + ) } else -> {} @@ -395,7 +411,11 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun setupCourseScrapStateObserver() { viewModel.courseScrapState.observe(viewLifecycleOwner) { state -> if (state is UiStateV2.Failure) { - context?.showSnackbar(binding.root, state.msg, Gravity.TOP) + context?.showSnackbar( + anchorView = binding.root, + message = state.msg, + gravity = Gravity.TOP + ) } } } From 458b935f55e62ec0c755b3917a7419d2cfd72aaf Mon Sep 17 00:00:00 2001 From: leeeha Date: Sat, 30 Dec 2023 22:30:20 +0900 Subject: [PATCH 56/61] =?UTF-8?q?[REFACTOR]=20#297=20=EC=8A=A4=EB=82=B5?= =?UTF-8?q?=EB=B0=94=20=EB=9D=84=EC=9A=B0=EB=8A=94=20=ED=99=95=EC=9E=A5?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=82=B4=EC=9A=A9=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - @GravityFlag 어노테이션 붙이기 - gravity 인자 타입 바꾸기 --- .../java/com/runnect/runnect/util/extension/ContextExt.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt index d1b4a52b3..667289a77 100644 --- a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt +++ b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt @@ -20,6 +20,7 @@ import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import com.google.android.material.bottomsheet.BottomSheetDialog import com.google.android.material.snackbar.Snackbar +import com.google.android.material.transition.SlideDistanceProvider.GravityFlag import com.runnect.runnect.R import kotlinx.android.synthetic.main.custom_dialog_delete.btn_delete_no import kotlinx.android.synthetic.main.custom_dialog_delete.view.btn_delete_no @@ -168,10 +169,10 @@ fun Context.showToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } -fun Context.showSnackbar(anchorView: View, message: String, gravity: Int = 0) { +fun Context.showSnackbar(anchorView: View, message: String, @GravityFlag gravity: Int? = null) { val snackbar = Snackbar.make(anchorView, message, Snackbar.LENGTH_SHORT) - if (gravity != 0) { + if (gravity != null) { val layoutParams = snackbar.view.layoutParams as CoordinatorLayout.LayoutParams layoutParams.apply { this.gravity = gravity From af6c4f4623f026ee10344ec76da5418b22c07c3f Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 3 Jan 2024 13:50:49 +0900 Subject: [PATCH 57/61] =?UTF-8?q?[MOD]=20#297=20=EC=8A=A4=EB=82=B5?= =?UTF-8?q?=EB=B0=94=20=ED=99=95=EC=9E=A5=ED=95=A8=EC=88=98=20=EC=9D=B8?= =?UTF-8?q?=EC=9E=90=20=ED=83=80=EC=9E=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/util/extension/ContextExt.kt | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt index 667289a77..e7f491a14 100644 --- a/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt +++ b/app/src/main/java/com/runnect/runnect/util/extension/ContextExt.kt @@ -169,17 +169,13 @@ fun Context.showToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_SHORT).show() } -fun Context.showSnackbar(anchorView: View, message: String, @GravityFlag gravity: Int? = null) { +fun Context.showSnackbar(anchorView: View, message: String, @GravityFlag gravity: Int = Gravity.BOTTOM) { val snackbar = Snackbar.make(anchorView, message, Snackbar.LENGTH_SHORT) - - if (gravity != null) { - val layoutParams = snackbar.view.layoutParams as CoordinatorLayout.LayoutParams - layoutParams.apply { - this.gravity = gravity - snackbar.view.layoutParams = this - } + val layoutParams = snackbar.view.layoutParams as CoordinatorLayout.LayoutParams + layoutParams.apply { + this.gravity = gravity + snackbar.view.layoutParams = this } - snackbar.show() } From 34aeaae21f8d96ca77cf7ae467547ee356e3331c Mon Sep 17 00:00:00 2001 From: leeeha Date: Wed, 3 Jan 2024 20:09:49 +0900 Subject: [PATCH 58/61] =?UTF-8?q?[MOD]=20#297=20RecommendCoursePagingData?= =?UTF-8?q?=20=EB=84=90=EC=B2=98=EB=A6=AC=20=EB=B0=A9=EB=B2=95=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 --- .../data/repository/CourseRepositoryImpl.kt | 6 ++-- .../entity/RecommendCoursePagingData.kt | 6 ++-- .../domain/repository/CourseRepository.kt | 2 +- .../discover/DiscoverViewModel.kt | 30 ++++++++++--------- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt b/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt index b3fb6946c..c8622db4c 100644 --- a/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt +++ b/app/src/main/java/com/runnect/runnect/data/repository/CourseRepositoryImpl.kt @@ -33,13 +33,15 @@ class CourseRepositoryImpl @Inject constructor(private val remoteCourseDataSourc override suspend fun getRecommendCourse( pageNo: String, ordering: String - ): Result = runCatching { + ): Result = runCatching { val response = remoteCourseDataSource.getRecommendCourse( pageNo = pageNo, ordering = ordering ).data - RecommendCoursePagingData(response?.isEnd, response?.toRecommendCourses()) + response?.let { + RecommendCoursePagingData(response.isEnd, response.toRecommendCourses()) + } } override suspend fun getCourseSearch(keyword: String): Result?> = diff --git a/app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt b/app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt index 33a51ce22..1e3fbe3f6 100644 --- a/app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt +++ b/app/src/main/java/com/runnect/runnect/domain/entity/RecommendCoursePagingData.kt @@ -1,6 +1,6 @@ package com.runnect.runnect.domain.entity data class RecommendCoursePagingData( - val isEnd: Boolean?, - val recommendCourses: List? -) + val isEnd: Boolean, + val recommendCourses: List +) \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt b/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt index 415d2adea..02665c5e1 100644 --- a/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt +++ b/app/src/main/java/com/runnect/runnect/domain/repository/CourseRepository.kt @@ -23,7 +23,7 @@ import retrofit2.Response interface CourseRepository { suspend fun getMarathonCourse(): Result?> - suspend fun getRecommendCourse(pageNo: String, ordering: String): Result + suspend fun getRecommendCourse(pageNo: String, ordering: String): Result suspend fun getCourseSearch(keyword: String): Result?> diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index 079bcabbc..b933b2e3f 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -111,16 +111,17 @@ class DiscoverViewModel @Inject constructor( courseRepository.getRecommendCourse(pageNo = pageNo.toString(), ordering = ordering) .onSuccess { pagingData -> - pagingData.isEnd?.let { - isRecommendCoursePageEnd = it + if (pagingData == null) { + _recommendCourseState.value = + UiStateV2.Failure("RECOMMEND COURSE DATA IS NULL") + return@onSuccess } - pagingData.recommendCourses?.let { - _multiViewItems.add(it) - _recommendCourseState.value = UiStateV2.Success(it) - Timber.d("RECOMMEND COURSE GET SUCCESS") - Timber.d("ITEM SIZE: ${multiViewItems.size}") - } + isRecommendCoursePageEnd = pagingData.isEnd + _multiViewItems.add(pagingData.recommendCourses) + _recommendCourseState.value = UiStateV2.Success(pagingData.recommendCourses) + Timber.d("RECOMMEND COURSE GET SUCCESS") + Timber.d("ITEM SIZE: ${multiViewItems.size}") }.onFailure { exception -> _recommendCourseState.value = UiStateV2.Failure(exception.message.toString()) Timber.e("RECOMMEND COURSE GET FAIL") @@ -143,14 +144,15 @@ class DiscoverViewModel @Inject constructor( ordering = "date" ) .onSuccess { pagingData -> - pagingData.isEnd?.let { - isRecommendCoursePageEnd = it + if (pagingData == null) { + _nextPageState.value = + UiStateV2.Failure("RECOMMEND COURSE NEXT PAGE DATA IS NULL") + return@onSuccess } - pagingData.recommendCourses?.let { - _nextPageState.value = UiStateV2.Success(it) - Timber.d("RECOMMEND COURSE NEXT PAGE GET SUCCESS") - } + isRecommendCoursePageEnd = pagingData.isEnd + _nextPageState.value = UiStateV2.Success(pagingData.recommendCourses) + Timber.d("RECOMMEND COURSE NEXT PAGE GET SUCCESS") } .onFailure { exception -> _nextPageState.value = UiStateV2.Failure(exception.message.toString()) From 203bda9957ccbedfcaee4ea7c953d962b080151e Mon Sep 17 00:00:00 2001 From: leeeha Date: Thu, 4 Jan 2024 00:20:01 +0900 Subject: [PATCH 59/61] =?UTF-8?q?[REFACTOR]=20#297=20EditableCourseDetail?= =?UTF-8?q?=20=EA=B0=9D=EC=B2=B4=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20named?= =?UTF-8?q?=20argument=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/presentation/detail/CourseDetailActivity.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt index f240bc262..1a3a13e38 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/detail/CourseDetailActivity.kt @@ -457,8 +457,10 @@ class CourseDetailActivity : courseDetail = state.data ?: return@observe binding.courseDetail = courseDetail - val editableCourseDetail = - EditableCourseDetail(courseDetail.title, courseDetail.description) + val editableCourseDetail = EditableCourseDetail( + title = courseDetail.title, + description = courseDetail.description + ) viewModel.updateCourseDetailEditText(editableCourseDetail) updateUserProfileStamp() From 31185040a3e761172a2235c796b6792aebac4b48 Mon Sep 17 00:00:00 2001 From: leeeha Date: Thu, 4 Jan 2024 00:32:28 +0900 Subject: [PATCH 60/61] =?UTF-8?q?[CHORE]=20#297=20Timber=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=EC=9D=98=20=EB=A0=88?= =?UTF-8?q?=EB=B2=A8=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../runnect/runnect/presentation/discover/DiscoverFragment.kt | 4 ++-- .../runnect/presentation/discover/DiscoverViewModel.kt | 2 +- .../discover/adapter/multiview/DiscoverMultiViewHolder.kt | 2 +- .../com/runnect/runnect/presentation/login/LoginActivity.kt | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt index a34a88523..a3a49ba67 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverFragment.kt @@ -156,10 +156,10 @@ class DiscoverFragment : BindingFragment(R.layout.fragm private fun checkNextPageLoadingCondition(recyclerView: RecyclerView) { if (!recyclerView.canScrollVertically(SCROLL_DIRECTION)) { - Timber.e("스크롤이 끝에 도달했어요!") + Timber.d("스크롤이 끝에 도달했어요!") if (viewModel.isNextPageLoading()) { - Timber.e("다음 페이지 로딩 중입니다.") + Timber.d("다음 페이지 로딩 중입니다.") return } diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt index b933b2e3f..f76fe6d8c 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/DiscoverViewModel.kt @@ -135,7 +135,7 @@ class DiscoverViewModel @Inject constructor( viewModelScope.launch { if (isRecommendCoursePageEnd) return@launch - Timber.e("다음 페이지를 요청했어요!") + Timber.d("다음 페이지를 요청했어요!") _nextPageState.value = UiStateV2.Loading currentPageNo++ diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt index fc1373716..c390ee67b 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolder.kt @@ -77,7 +77,7 @@ sealed class DiscoverMultiViewHolder(binding: ViewDataBinding) : } fun bind(courses: List) { - Timber.e("추천 코스 리스트 크기: ${courses.size}") + Timber.d("추천 코스 리스트 크기: ${courses.size}") initRecommendRecyclerView(courses) } diff --git a/app/src/main/java/com/runnect/runnect/presentation/login/LoginActivity.kt b/app/src/main/java/com/runnect/runnect/presentation/login/LoginActivity.kt index ca0541de4..1234ae32a 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/login/LoginActivity.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/login/LoginActivity.kt @@ -122,8 +122,8 @@ class LoginActivity : BindingActivity(com.runnect.runnect. key = TOKEN_KEY_REFRESH, value = viewModel.loginResult.value?.refreshToken ) - Timber.e("ACCESS TOKEN: ${viewModel.loginResult.value?.accessToken}") - Timber.e("REFRESH TOKEN: ${viewModel.loginResult.value?.refreshToken}") + Timber.d("ACCESS TOKEN: ${viewModel.loginResult.value?.accessToken}") + Timber.d("REFRESH TOKEN: ${viewModel.loginResult.value?.refreshToken}") } private fun moveToMain() { From 7b281545de4df7b9a27fe41d929b899dc0c8efbb Mon Sep 17 00:00:00 2001 From: leeeha Date: Fri, 5 Jan 2024 21:08:21 +0900 Subject: [PATCH 61/61] =?UTF-8?q?[FEAT]=20#297=20=ED=8A=B9=EC=A0=95=20?= =?UTF-8?q?=EB=A0=88=EC=9D=B4=EC=95=84=EC=9B=83=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=EB=B0=94=EC=9D=B8=EB=94=A9=20=EA=B0=9D=EC=B2=B4?= =?UTF-8?q?=EB=A5=BC=20=EB=B0=98=ED=99=98=ED=95=98=EB=8A=94=20=ED=99=95?= =?UTF-8?q?=EC=9E=A5=20=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 코스 발견 리사이클러뷰의 멀티 뷰 홀더 팩토리 내부 코드에 적용 --- .../DiscoverMultiViewHolderFactory.kt | 22 +++---------------- .../runnect/runnect/util/extension/ViewExt.kt | 14 ++++++++++++ 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt index 4ffbe2862..fac9d33b6 100644 --- a/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt +++ b/app/src/main/java/com/runnect/runnect/presentation/discover/adapter/multiview/DiscoverMultiViewHolderFactory.kt @@ -1,11 +1,8 @@ package com.runnect.runnect.presentation.discover.adapter.multiview -import android.view.LayoutInflater import android.view.ViewGroup -import androidx.annotation.LayoutRes -import androidx.databinding.DataBindingUtil -import androidx.databinding.ViewDataBinding import com.runnect.runnect.R +import com.runnect.runnect.util.extension.getViewDataBinding class DiscoverMultiViewHolderFactory { lateinit var marathonViewHolder: DiscoverMultiViewHolder.MarathonCourseViewHolder @@ -21,7 +18,7 @@ class DiscoverMultiViewHolderFactory { when (viewType) { DiscoverMultiViewType.MARATHON -> { marathonViewHolder = DiscoverMultiViewHolder.MarathonCourseViewHolder( - binding = getViewBinding(parent, R.layout.item_discover_multiview_marathon), + binding = parent.getViewDataBinding(layoutRes = R.layout.item_discover_multiview_marathon), onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode @@ -31,10 +28,7 @@ class DiscoverMultiViewHolderFactory { DiscoverMultiViewType.RECOMMEND -> { recommendViewHolder = DiscoverMultiViewHolder.RecommendCourseViewHolder( - binding = getViewBinding( - parent, - R.layout.item_discover_multiview_recommend - ), + binding = parent.getViewDataBinding(layoutRes = R.layout.item_discover_multiview_recommend), onHeartButtonClick = onHeartButtonClick, onCourseItemClick = onCourseItemClick, handleVisitorMode = handleVisitorMode @@ -43,14 +37,4 @@ class DiscoverMultiViewHolderFactory { } } } - - private fun getViewBinding( - parent: ViewGroup, - @LayoutRes layoutRes: Int - ): T = DataBindingUtil.inflate( - LayoutInflater.from(parent.context), - layoutRes, - parent, - false - ) } \ No newline at end of file diff --git a/app/src/main/java/com/runnect/runnect/util/extension/ViewExt.kt b/app/src/main/java/com/runnect/runnect/util/extension/ViewExt.kt index 80e66da42..bc067f993 100644 --- a/app/src/main/java/com/runnect/runnect/util/extension/ViewExt.kt +++ b/app/src/main/java/com/runnect/runnect/util/extension/ViewExt.kt @@ -1,6 +1,11 @@ package com.runnect.runnect.util.extension +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup +import androidx.annotation.LayoutRes +import androidx.databinding.DataBindingUtil +import androidx.databinding.ViewDataBinding inline fun View.setOnSingleClickListener( delay: Long = 500L, @@ -15,3 +20,12 @@ inline fun View.setOnSingleClickListener( } } } + +fun ViewGroup.getViewDataBinding( + @LayoutRes layoutRes: Int +): T = DataBindingUtil.inflate( + LayoutInflater.from(this.context), + layoutRes, + this, + false +) \ No newline at end of file