diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentNewAndHotAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentNewAndHotAdapter.kt new file mode 100644 index 00000000..2eb86b4f --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/ui/ContentNewAndHotAdapter.kt @@ -0,0 +1,80 @@ +package kr.co.vividnext.sodalive.v2.main.content.ui + +import android.graphics.Outline +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.ViewOutlineProvider +import androidx.core.view.isVisible +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.databinding.ItemContentAudioListBinding +import kr.co.vividnext.sodalive.databinding.ItemContentNewAndHotGroupBinding +import kr.co.vividnext.sodalive.extensions.loadUrl +import kr.co.vividnext.sodalive.v2.main.content.model.ContentAudioCardUiModel +import kr.co.vividnext.sodalive.v2.widget.AudioContentTag + +class ContentNewAndHotAdapter( + private val onAudioClick: (ContentAudioCardUiModel) -> Unit = {} +) : RecyclerView.Adapter() { + + private var groups: List> = emptyList() + + fun submitItems(items: List) { + groups = items.chunked(NEW_AND_HOT_GROUP_SIZE) + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + ItemContentNewAndHotGroupBinding.inflate(LayoutInflater.from(parent.context), parent, false), + onAudioClick + ) + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(groups[position]) + } + + override fun getItemCount(): Int = groups.size + + class ViewHolder( + private val binding: ItemContentNewAndHotGroupBinding, + private val onAudioClick: (ContentAudioCardUiModel) -> Unit + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(items: List) = with(binding.root) { + removeAllViews() + items.forEach { item -> + val rowBinding = ItemContentAudioListBinding.inflate(LayoutInflater.from(context), this, false) + bindRow(rowBinding, item) + addView(rowBinding.root) + } + } + + private fun bindRow(binding: ItemContentAudioListBinding, item: ContentAudioCardUiModel) = with(binding) { + layoutContentAudioListThumbnail.clipToOutline = true + layoutContentAudioListThumbnail.outlineProvider = thumbnailOutlineProvider + ivContentAudioListThumbnail.loadUrl(item.imageUrl) + tvContentAudioListTitle.text = item.title + tvContentAudioListCreator.text = item.creatorNickname + ivContentAudioListAdultBadge.isVisible = item.showAdultBadge + bindTag(ivContentAudioListOriginalTag, AudioContentTag.Original, item.tags) + bindTag(ivContentAudioListFirstTag, AudioContentTag.First, item.tags) + bindTag(ivContentAudioListPointTag, AudioContentTag.Point, item.tags) + tvContentAudioListFreeTag.isVisible = AudioContentTag.Free in item.tags + root.setOnClickListener { onAudioClick(item) } + } + + private fun bindTag(view: View, tag: AudioContentTag, tags: Set) { + view.isVisible = tag in tags + } + + private val thumbnailOutlineProvider = object : ViewOutlineProvider() { + override fun getOutline(view: View, outline: Outline) { + outline.setRoundRect(0, 0, view.width, view.height, view.resources.getDimension(R.dimen.radius_14)) + } + } + } +} + +private const val NEW_AND_HOT_GROUP_SIZE = 3 diff --git a/app/src/main/res/layout/item_content_audio_list.xml b/app/src/main/res/layout/item_content_audio_list.xml new file mode 100644 index 00000000..a0cd3676 --- /dev/null +++ b/app/src/main/res/layout/item_content_audio_list.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/item_content_new_and_hot_group.xml b/app/src/main/res/layout/item_content_new_and_hot_group.xml new file mode 100644 index 00000000..3de1a5e9 --- /dev/null +++ b/app/src/main/res/layout/item_content_new_and_hot_group.xml @@ -0,0 +1,6 @@ + +