From 00aac29d895c29c2dc74e753f279433132a80114 Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 25 Jun 2026 12:23:12 +0900 Subject: [PATCH] =?UTF-8?q?fix(content):=20=EC=A0=84=EC=B2=B4=20=ED=83=AD?= =?UTF-8?q?=20grid=20=EA=B0=84=EA=B2=A9=EC=9D=84=20=EB=B3=B4=EC=A0=95?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/ui/ContentRecyclerItemLayoutParams.kt | 9 +++++---- .../main/content/ContentMainFragmentSourceTest.kt | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentRecyclerItemLayoutParams.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentRecyclerItemLayoutParams.kt index 6afb73f9..7be7e613 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentRecyclerItemLayoutParams.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentRecyclerItemLayoutParams.kt @@ -4,6 +4,7 @@ import android.graphics.Rect import android.view.View import androidx.recyclerview.widget.RecyclerView import kr.co.vividnext.sodalive.extensions.dpToPx +import kotlin.math.roundToInt fun RecyclerView.addContentHorizontalItemSpacing() { if (itemDecorationCount == 0) addItemDecoration(ContentHorizontalItemDecoration()) @@ -28,10 +29,10 @@ private class ContentGridItemDecoration( override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { val position = parent.getChildAdapterPosition(view) if (position == RecyclerView.NO_POSITION) return - val isLeftColumn = position % spanCount == 0 - val halfGap = GRID_ITEM_GAP_DP.dpToPx().toInt() / 2 - outRect.left = if (isLeftColumn) 0 else halfGap - outRect.right = if (isLeftColumn) halfGap else 0 + val columnIndex = position % spanCount + val gap = GRID_ITEM_GAP_DP.dpToPx() + outRect.left = (columnIndex * gap / spanCount).roundToInt() + outRect.right = (gap - (columnIndex + 1) * gap / spanCount).roundToInt() if (position >= spanCount) outRect.top = GRID_ITEM_VERTICAL_GAP_DP.dpToPx().toInt() } } diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt index 85630d86..026f48dd 100644 --- a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/ContentMainFragmentSourceTest.kt @@ -219,6 +219,21 @@ class ContentMainFragmentSourceTest { assertSourceContains(source, "binding.tvContentAllTotalCount.text") } + @Test + fun `content grid item spacing은 span count 기반으로 열 간격을 계산한다`() { + val source = projectFile( + "app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentRecyclerItemLayoutParams.kt" + ).readText() + + assertSourceContains(source, "val columnIndex = position % spanCount") + assertSourceContains(source, "outRect.left = (columnIndex * gap / spanCount).roundToInt()") + assertSourceContains(source, "outRect.right = (gap - (columnIndex + 1) * gap / spanCount).roundToInt()") + assertFalse( + "3열 grid spacing은 left column 여부만으로 계산하면 인접 열 간격이 불균형해진다.", + source.contains("isLeftColumn") + ) + } + @Test fun `content 추천 source는 오디오와 시리즈 routing extra를 사용한다`() { val source = projectFile(