From c1a21985fd9b88ca89151e246100261ef5ce6a11 Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 25 Jun 2026 11:54:05 +0900 Subject: [PATCH] =?UTF-8?q?feat(content):=20=EC=A0=84=EC=B2=B4=20=ED=83=AD?= =?UTF-8?q?=20=EC=B9=B4=EB=93=9C=20=EC=96=B4=EB=8C=91=ED=84=B0=EB=A5=BC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/ui/ContentAllAudioCardAdapter.kt | 48 +++++++++++++++++++ .../content/ui/ContentAllSeriesCardAdapter.kt | 48 +++++++++++++++++++ .../ui/ContentRecyclerItemLayoutParams.kt | 13 ++--- .../drawable/bg_content_all_day_filter.xml | 5 ++ .../drawable/bg_content_all_day_selected.xml | 5 ++ .../layout/item_content_all_series_card.xml | 9 ++++ 6 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllAudioCardAdapter.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllSeriesCardAdapter.kt create mode 100644 app/src/main/res/drawable/bg_content_all_day_filter.xml create mode 100644 app/src/main/res/drawable/bg_content_all_day_selected.xml create mode 100644 app/src/main/res/layout/item_content_all_series_card.xml diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllAudioCardAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllAudioCardAdapter.kt new file mode 100644 index 00000000..42792086 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllAudioCardAdapter.kt @@ -0,0 +1,48 @@ +package kr.co.vividnext.sodalive.v2.main.content.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.databinding.ItemContentAudioCardBinding +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.content.model.MainContentAllAudioUiModel +import kr.co.vividnext.sodalive.v2.widget.AudioContentCardSize + +class ContentAllAudioCardAdapter( + private val onAudioClick: (Long) -> Unit = {} +) : RecyclerView.Adapter() { + + private var items: List = emptyList() + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ItemContentAudioCardBinding.inflate(LayoutInflater.from(parent.context), parent, false), + onAudioClick + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + class ViewHolder( + private val binding: ItemContentAudioCardBinding, + private val onAudioClick: (Long) -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: MainContentAllAudioUiModel) = with(binding.audioContentCard.root) { + setSize(AudioContentCardSize.Small) + setContent(item.title, item.creatorNickname) + setTags(item.tags) + setAdultVisible(item.showAdultBadge) + thumbnailView().loadUrl(item.imageUrl) + setOnClickListener { onAudioClick(item.audioContentId) } + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllSeriesCardAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllSeriesCardAdapter.kt new file mode 100644 index 00000000..9ab620f1 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAllSeriesCardAdapter.kt @@ -0,0 +1,48 @@ +package kr.co.vividnext.sodalive.v2.main.content.ui + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.databinding.ItemContentAllSeriesCardBinding +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.content.model.MainContentAllSeriesUiModel +import kr.co.vividnext.sodalive.v2.widget.SeriesContentCardSize + +class ContentAllSeriesCardAdapter( + private val onSeriesClick: (Long) -> Unit = {} +) : RecyclerView.Adapter() { + + private var items: List = emptyList() + + fun submitItems(items: List) { + this.items = items + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ItemContentAllSeriesCardBinding.inflate(LayoutInflater.from(parent.context), parent, false), + onSeriesClick + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int = items.size + + class ViewHolder( + private val binding: ItemContentAllSeriesCardBinding, + private val onSeriesClick: (Long) -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: MainContentAllSeriesUiModel) = with(binding.seriesContentCard.root) { + setSize(SeriesContentCardSize.Small) + setContent(item.title, item.creatorNickname) + setOriginalVisible(item.showOriginalTag) + setAdultVisible(item.showAdultBadge) + thumbnailView().loadUrl(item.coverImageUrl) + setOnClickListener { onSeriesClick(item.seriesId) } + } + } +} 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 60ade9c5..6afb73f9 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 @@ -9,8 +9,8 @@ fun RecyclerView.addContentHorizontalItemSpacing() { if (itemDecorationCount == 0) addItemDecoration(ContentHorizontalItemDecoration()) } -fun RecyclerView.addContentGridItemSpacing() { - if (itemDecorationCount == 0) addItemDecoration(ContentGridItemDecoration()) +fun RecyclerView.addContentGridItemSpacing(spanCount: Int = CONTENT_RECOMMENDED_GRID_SPAN_COUNT) { + if (itemDecorationCount == 0) addItemDecoration(ContentGridItemDecoration(spanCount)) } private class ContentHorizontalItemDecoration : RecyclerView.ItemDecoration() { @@ -22,15 +22,17 @@ private class ContentHorizontalItemDecoration : RecyclerView.ItemDecoration() { } } -private class ContentGridItemDecoration : RecyclerView.ItemDecoration() { +private class ContentGridItemDecoration( + private val spanCount: Int +) : RecyclerView.ItemDecoration() { 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 % GRID_SPAN_COUNT == 0 + 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 - if (position >= GRID_SPAN_COUNT) outRect.top = GRID_ITEM_VERTICAL_GAP_DP.dpToPx().toInt() + if (position >= spanCount) outRect.top = GRID_ITEM_VERTICAL_GAP_DP.dpToPx().toInt() } } @@ -38,4 +40,3 @@ private const val HORIZONTAL_ITEM_GAP_DP = 8 private const val GRID_ITEM_GAP_DP = 8 private const val GRID_ITEM_VERTICAL_GAP_DP = 28 const val CONTENT_RECOMMENDED_GRID_SPAN_COUNT = 2 -private const val GRID_SPAN_COUNT = CONTENT_RECOMMENDED_GRID_SPAN_COUNT diff --git a/app/src/main/res/drawable/bg_content_all_day_filter.xml b/app/src/main/res/drawable/bg_content_all_day_filter.xml new file mode 100644 index 00000000..1a8f6cad --- /dev/null +++ b/app/src/main/res/drawable/bg_content_all_day_filter.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/bg_content_all_day_selected.xml b/app/src/main/res/drawable/bg_content_all_day_selected.xml new file mode 100644 index 00000000..a7ab8371 --- /dev/null +++ b/app/src/main/res/drawable/bg_content_all_day_selected.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/item_content_all_series_card.xml b/app/src/main/res/layout/item_content_all_series_card.xml new file mode 100644 index 00000000..81f12f28 --- /dev/null +++ b/app/src/main/res/layout/item_content_all_series_card.xml @@ -0,0 +1,9 @@ + + + + +