From 27add8b244ddf700af646fc5c3d828125e83b1e7 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 23 Jun 2026 17:17:33 +0900 Subject: [PATCH] =?UTF-8?q?feat(content):=20=EC=B6=94=EC=B2=9C=20=EA=B3=B5?= =?UTF-8?q?=ED=86=B5=20=EC=98=A4=EB=94=94=EC=98=A4=20=EC=B9=B4=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=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/ContentAudioCardAdapter.kt | 51 +++++++++++++++++++ .../v2/widget/AudioContentCardView.kt | 7 +++ .../res/layout/item_content_audio_card.xml | 9 ++++ .../res/layout/view_audio_content_card.xml | 13 +++++ 4 files changed, 80 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAudioCardAdapter.kt create mode 100644 app/src/main/res/layout/item_content_audio_card.xml diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAudioCardAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAudioCardAdapter.kt new file mode 100644 index 00000000..9e06c629 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentAudioCardAdapter.kt @@ -0,0 +1,51 @@ +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.ContentAudioCardUiModel +import kr.co.vividnext.sodalive.v2.widget.AudioContentCardSize + +class ContentAudioCardAdapter( + private val cardSize: AudioContentCardSize, + private val onAudioClick: (ContentAudioCardUiModel) -> 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), + cardSize, + 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 cardSize: AudioContentCardSize, + private val onAudioClick: (ContentAudioCardUiModel) -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: ContentAudioCardUiModel) = with(binding.audioContentCard.root) { + setSize(cardSize) + setContent(item.title, item.creatorNickname) + setTags(item.tags) + setAdultVisible(item.showAdultBadge) + thumbnailView().loadUrl(item.imageUrl) + setOnClickListener { onAudioClick(item) } + } + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt index 1dd498ce..e6e01858 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/widget/AudioContentCardView.kt @@ -26,6 +26,7 @@ class AudioContentCardView @JvmOverloads constructor( private var thumbnail: ImageView? = null private var topTagContainer: LinearLayout? = null private var bottomTagContainer: LinearLayout? = null + private var adultBadge: ImageView? = null private var labelContainer: LinearLayout? = null private var titleText: TextView? = null private var creatorText: TextView? = null @@ -40,6 +41,7 @@ class AudioContentCardView @JvmOverloads constructor( thumbnail = findViewById(R.id.iv_audio_content_thumbnail) topTagContainer = findViewById(R.id.ll_audio_content_tag_top) bottomTagContainer = findViewById(R.id.ll_audio_content_tag_bottom) + adultBadge = findViewById(R.id.iv_audio_content_adult_badge) labelContainer = findViewById(R.id.ll_audio_content_label) titleText = findViewById(R.id.tv_audio_content_title) creatorText = findViewById(R.id.tv_audio_content_creator) @@ -90,6 +92,10 @@ class AudioContentCardView @JvmOverloads constructor( fun thumbnailView(): ImageView = requireNotNull(thumbnail) + fun setAdultVisible(isVisible: Boolean) { + requireNotNull(adultBadge).visibility = if (isVisible) VISIBLE else GONE + } + fun setTags(tags: Set) { renderTags(requireNotNull(topTagContainer), orderedAudioContentTopTags(tags)) renderTags(requireNotNull(bottomTagContainer), orderedAudioContentBottomTags(tags)) @@ -205,6 +211,7 @@ class AudioContentCardView @JvmOverloads constructor( thumbnail != null && topTagContainer != null && bottomTagContainer != null && + adultBadge != null && labelContainer != null && titleText != null && creatorText != null diff --git a/app/src/main/res/layout/item_content_audio_card.xml b/app/src/main/res/layout/item_content_audio_card.xml new file mode 100644 index 00000000..b0fbdc4e --- /dev/null +++ b/app/src/main/res/layout/item_content_audio_card.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/app/src/main/res/layout/view_audio_content_card.xml b/app/src/main/res/layout/view_audio_content_card.xml index d25b2b01..8bc8fc6c 100644 --- a/app/src/main/res/layout/view_audio_content_card.xml +++ b/app/src/main/res/layout/view_audio_content_card.xml @@ -18,6 +18,19 @@ android:contentDescription="@null" android:scaleType="centerCrop" /> + +