refactor(home): 홈 추천 adapter 파일을 분리한다

This commit is contained in:
2026-06-02 16:34:16 +09:00
parent 0a5be6467c
commit 9a8231c2b6
12 changed files with 369 additions and 313 deletions

View File

@@ -0,0 +1,45 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationAiCharacterUiModel
import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailItem
import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailView
class HomeAiCharacterAdapter : RecyclerView.Adapter<HomeAiCharacterAdapter.CharacterViewHolder>() {
private var items: List<HomeRecommendationAiCharacterUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationAiCharacterUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CharacterViewHolder {
val view = LayoutInflater.from(parent.context).inflate(
R.layout.view_character_chat_thumbnail,
parent,
false
) as CharacterChatThumbnailView
view.layoutParams = recyclerItemLayoutParams(parent)
return CharacterViewHolder(view)
}
override fun onBindViewHolder(holder: CharacterViewHolder, position: Int) {
holder.bind(items[position].item)
}
override fun getItemCount(): Int = items.size
class CharacterViewHolder(
private val view: CharacterChatThumbnailView
) : RecyclerView.ViewHolder(view) {
fun bind(item: CharacterChatThumbnailItem) {
view.bind(item)
view.imageView().loadUrl(item.imageUrl)
view.setOnCharacterClick(null)
}
}
}

View File

@@ -0,0 +1,37 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerSection
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel
import kr.co.vividnext.sodalive.v2.widget.banner.BannerItem
import kr.co.vividnext.sodalive.v2.widget.banner.BannerView
class HomeBannerBinder(
private val bannerView: BannerView
) {
private var sourceItems: List<HomeRecommendationBannerUiModel> = emptyList()
private var onBannerClick: ((HomeRecommendationBannerUiModel) -> Unit)? = null
init {
bannerView.setOnBindBannerImage { imageView, item -> imageView.loadUrl(item.imageUrl) }
bannerView.setOnBannerClickListener { bannerItem ->
sourceItems.firstOrNull { it.bannerId == bannerItem.bannerId }?.let { onBannerClick?.invoke(it) }
}
}
fun setOnBannerClick(listener: ((HomeRecommendationBannerUiModel) -> Unit)?) {
onBannerClick = listener
}
fun bind(section: HomeRecommendationBannerSection) {
sourceItems = section.items
bannerView.setItems(
section.items.map { item ->
BannerItem(
bannerId = item.bannerId,
imageUrl = item.imageUrl.orEmpty()
)
}
)
}
}

View File

@@ -0,0 +1,3 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
class HomeCheerCreatorAdapter : HomeCreatorProfileAdapter()

View File

@@ -0,0 +1,42 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationCreatorUiModel
open class HomeCreatorProfileAdapter : RecyclerView.Adapter<HomeCreatorProfileAdapter.CreatorViewHolder>() {
private var items: List<HomeRecommendationCreatorUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationCreatorUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_creator_profile, parent, false)
view.layoutParams = recyclerItemLayoutParams(parent)
return CreatorViewHolder(view)
}
override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val profileImage = itemView.findViewById<ImageView>(R.id.iv_home_creator_profile)
private val nicknameText = itemView.findViewById<TextView>(R.id.tv_home_creator_profile_nickname)
fun bind(item: HomeRecommendationCreatorUiModel) {
profileImage.loadUrl(item.profileImage)
nicknameText.text = item.nickname
}
}
}

View File

@@ -0,0 +1,46 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationFirstAudioContentUiModel
import kr.co.vividnext.sodalive.v2.widget.AudioContentCardSize
import kr.co.vividnext.sodalive.v2.widget.AudioContentCardView
class HomeFirstAudioAdapter : RecyclerView.Adapter<HomeFirstAudioAdapter.AudioViewHolder>() {
private var items: List<HomeRecommendationFirstAudioContentUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationFirstAudioContentUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AudioViewHolder {
val view = LayoutInflater.from(parent.context).inflate(
R.layout.view_audio_content_card,
parent,
false
) as AudioContentCardView
view.layoutParams = recyclerItemLayoutParams(parent)
return AudioViewHolder(view)
}
override fun onBindViewHolder(holder: AudioViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class AudioViewHolder(
private val view: AudioContentCardView
) : RecyclerView.ViewHolder(view) {
fun bind(item: HomeRecommendationFirstAudioContentUiModel) {
view.setSize(AudioContentCardSize.Medium)
view.setContent(item.title, item.creatorNickname)
view.thumbnailView().loadUrl(item.coverImage)
view.setTags(item.tags)
}
}
}

View File

@@ -0,0 +1,30 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import kr.co.vividnext.sodalive.R
object HomeFollowAllButtonBinder {
fun bind(
view: View,
creatorIds: List<Long>,
isFollowCompleted: Boolean,
onClick: (List<Long>) -> Unit
) {
val icon = view.findViewById<ImageView>(R.id.iv_home_follow_all_icon)
val text = view.findViewById<TextView>(R.id.tv_home_follow_all)
icon.setImageResource(if (isFollowCompleted) R.drawable.ic_new_following else R.drawable.ic_new_follow)
text.setText(
if (isFollowCompleted) {
R.string.home_recommendation_follow_all_done
} else {
R.string.home_recommendation_follow_all
}
)
view.isEnabled = !isFollowCompleted
view.setOnClickListener {
if (creatorIds.isNotEmpty()) onClick(creatorIds)
}
}
}

View File

@@ -0,0 +1,3 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
class HomeGenreCreatorAdapter : HomeCreatorProfileAdapter()

View File

@@ -0,0 +1,57 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationLiveUiModel
import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailItem
import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailSimpleView
class HomeLiveAdapter : RecyclerView.Adapter<HomeLiveAdapter.LiveViewHolder>() {
private var items: List<HomeRecommendationLiveUiModel> = emptyList()
private var onClick: ((HomeRecommendationLiveUiModel) -> Unit)? = null
fun submitItems(items: List<HomeRecommendationLiveUiModel>) {
this.items = items
notifyDataSetChanged()
}
fun setOnLiveClick(listener: ((HomeRecommendationLiveUiModel) -> Unit)?) {
onClick = listener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LiveViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.view_live_thumbnail_simple, parent, false)
view.layoutParams = recyclerItemLayoutParams(parent)
return LiveViewHolder(view as LiveThumbnailSimpleView)
}
override fun onBindViewHolder(holder: LiveViewHolder, position: Int) {
holder.bind(items[position], onClick)
}
override fun getItemCount(): Int = items.size
class LiveViewHolder(
private val view: LiveThumbnailSimpleView
) : RecyclerView.ViewHolder(view) {
fun bind(
item: HomeRecommendationLiveUiModel,
onClick: ((HomeRecommendationLiveUiModel) -> Unit)?
) {
val thumbnailItem = LiveThumbnailItem(
liveId = item.liveId,
creatorId = item.creatorId,
imageUrl = item.imageUrl.orEmpty(),
title = item.title,
creatorName = item.creatorNickname,
liveStartTimeText = item.beginDateTime.orEmpty()
)
view.bind(thumbnailItem)
view.imageView().loadUrl(item.imageUrl)
view.setOnLiveThumbnailClick(if (onClick == null) null else { _: LiveThumbnailItem -> onClick.invoke(item) })
}
}
}

View File

@@ -1,313 +0,0 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationAiCharacterUiModel
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerSection
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationCreatorUiModel
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationFirstAudioContentUiModel
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationLiveUiModel
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorUiModel
import kr.co.vividnext.sodalive.v2.widget.AudioContentCardSize
import kr.co.vividnext.sodalive.v2.widget.AudioContentCardView
import kr.co.vividnext.sodalive.v2.widget.banner.BannerItem
import kr.co.vividnext.sodalive.v2.widget.banner.BannerView
import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailItem
import kr.co.vividnext.sodalive.v2.widget.characterchatthumbnail.CharacterChatThumbnailView
import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailItem
import kr.co.vividnext.sodalive.v2.widget.livethumbnail.LiveThumbnailSimpleView
class HomeLiveAdapter : RecyclerView.Adapter<HomeLiveAdapter.LiveViewHolder>() {
private var items: List<HomeRecommendationLiveUiModel> = emptyList()
private var onClick: ((HomeRecommendationLiveUiModel) -> Unit)? = null
fun submitItems(items: List<HomeRecommendationLiveUiModel>) {
this.items = items
notifyDataSetChanged()
}
fun setOnLiveClick(listener: ((HomeRecommendationLiveUiModel) -> Unit)?) {
onClick = listener
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LiveViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.view_live_thumbnail_simple, parent, false)
view.layoutParams = RecyclerView.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply { marginEnd = parent.resources.getDimensionPixelSize(R.dimen.spacing_12) }
return LiveViewHolder(view as LiveThumbnailSimpleView)
}
override fun onBindViewHolder(holder: LiveViewHolder, position: Int) {
holder.bind(items[position], onClick)
}
override fun getItemCount(): Int = items.size
class LiveViewHolder(
private val view: LiveThumbnailSimpleView
) : RecyclerView.ViewHolder(view) {
fun bind(
item: HomeRecommendationLiveUiModel,
onClick: ((HomeRecommendationLiveUiModel) -> Unit)?
) {
val thumbnailItem = LiveThumbnailItem(
liveId = item.liveId,
creatorId = item.creatorId,
imageUrl = item.imageUrl.orEmpty(),
title = item.title,
creatorName = item.creatorNickname,
liveStartTimeText = item.beginDateTime.orEmpty()
)
view.bind(thumbnailItem)
view.imageView().loadUrl(item.imageUrl)
view.setOnLiveThumbnailClick(if (onClick == null) null else { _: LiveThumbnailItem -> onClick.invoke(item) })
}
}
}
class HomeBannerBinder(
private val bannerView: BannerView
) {
private var sourceItems: List<kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel> = emptyList()
private var onBannerClick: ((kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel) -> Unit)? = null
init {
bannerView.setOnBindBannerImage { imageView, item -> imageView.loadUrl(item.imageUrl) }
bannerView.setOnBannerClickListener { bannerItem ->
sourceItems.firstOrNull { it.bannerId == bannerItem.bannerId }?.let { onBannerClick?.invoke(it) }
}
}
fun setOnBannerClick(listener: ((kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationBannerUiModel) -> Unit)?) {
onBannerClick = listener
}
fun bind(section: HomeRecommendationBannerSection) {
sourceItems = section.items
bannerView.setItems(
section.items.map { item ->
BannerItem(
bannerId = item.bannerId,
imageUrl = item.imageUrl.orEmpty()
)
}
)
}
}
class HomeRecentActivityCreatorAdapter : RecyclerView.Adapter<HomeRecentActivityCreatorAdapter.CreatorViewHolder>() {
private var items: List<HomeRecommendationRecentlyActiveCreatorUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationRecentlyActiveCreatorUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_activity_creator, parent, false)
view.layoutParams = recyclerItemLayoutParams(parent)
return CreatorViewHolder(view)
}
override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val profileImage = itemView.findViewById<ImageView>(R.id.iv_home_recent_activity_creator_profile)
private val activityTypeText = itemView.findViewById<TextView>(R.id.tv_home_recent_activity_type)
private val titleText = itemView.findViewById<TextView>(R.id.tv_home_recent_activity_title)
private val nicknameText = itemView.findViewById<TextView>(R.id.tv_home_recent_activity_nickname)
fun bind(item: HomeRecommendationRecentlyActiveCreatorUiModel) {
profileImage.loadUrl(item.profileImage)
item.activityLabelResId?.let { labelResId ->
activityTypeText.setText(labelResId)
activityTypeText.visibility = View.VISIBLE
} ?: run {
activityTypeText.visibility = View.GONE
}
titleText.text = item.activityAt.orEmpty()
titleText.visibility = if (item.activityAt.isNullOrBlank()) View.GONE else View.VISIBLE
nicknameText.text = item.nickname
}
}
}
class HomeRecentDebutCreatorAdapter : RecyclerView.Adapter<HomeRecentDebutCreatorAdapter.CreatorViewHolder>() {
private var items: List<HomeRecommendationCreatorUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationCreatorUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_debut_creator, parent, false)
view.layoutParams = recyclerItemLayoutParams(parent)
return CreatorViewHolder(view)
}
override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val profileImage = itemView.findViewById<ImageView>(R.id.iv_home_recent_debut_creator_profile)
private val nicknameText = itemView.findViewById<TextView>(R.id.tv_home_recent_debut_creator_nickname)
fun bind(item: HomeRecommendationCreatorUiModel) {
profileImage.loadUrl(item.profileImage)
nicknameText.text = item.nickname
}
}
}
class HomeFirstAudioAdapter : RecyclerView.Adapter<HomeFirstAudioAdapter.AudioViewHolder>() {
private var items: List<HomeRecommendationFirstAudioContentUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationFirstAudioContentUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AudioViewHolder {
val view = LayoutInflater.from(parent.context).inflate(
R.layout.view_audio_content_card,
parent,
false
) as AudioContentCardView
view.layoutParams = recyclerItemLayoutParams(parent)
return AudioViewHolder(view)
}
override fun onBindViewHolder(holder: AudioViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class AudioViewHolder(
private val view: AudioContentCardView
) : RecyclerView.ViewHolder(view) {
fun bind(item: HomeRecommendationFirstAudioContentUiModel) {
view.setSize(AudioContentCardSize.Medium)
view.setContent(item.title, item.creatorNickname)
view.thumbnailView().loadUrl(item.coverImage)
view.setTags(item.tags)
}
}
}
class HomeAiCharacterAdapter : RecyclerView.Adapter<HomeAiCharacterAdapter.CharacterViewHolder>() {
private var items: List<HomeRecommendationAiCharacterUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationAiCharacterUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CharacterViewHolder {
val view = LayoutInflater.from(parent.context).inflate(
R.layout.view_character_chat_thumbnail,
parent,
false
) as CharacterChatThumbnailView
view.layoutParams = recyclerItemLayoutParams(parent)
return CharacterViewHolder(view)
}
override fun onBindViewHolder(holder: CharacterViewHolder, position: Int) {
holder.bind(items[position].item)
}
override fun getItemCount(): Int = items.size
class CharacterViewHolder(
private val view: CharacterChatThumbnailView
) : RecyclerView.ViewHolder(view) {
fun bind(item: CharacterChatThumbnailItem) {
view.bind(item)
view.imageView().loadUrl(item.imageUrl)
view.setOnCharacterClick(null)
}
}
}
class HomeGenreCreatorAdapter : HomeCreatorProfileAdapter()
class HomeCheerCreatorAdapter : HomeCreatorProfileAdapter()
open class HomeCreatorProfileAdapter : RecyclerView.Adapter<HomeCreatorProfileAdapter.CreatorViewHolder>() {
private var items: List<HomeRecommendationCreatorUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationCreatorUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_creator_profile, parent, false)
view.layoutParams = recyclerItemLayoutParams(parent)
return CreatorViewHolder(view)
}
override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val profileImage = itemView.findViewById<ImageView>(R.id.iv_home_creator_profile)
private val nicknameText = itemView.findViewById<TextView>(R.id.tv_home_creator_profile_nickname)
fun bind(item: HomeRecommendationCreatorUiModel) {
profileImage.loadUrl(item.profileImage)
nicknameText.text = item.nickname
}
}
}
object HomeFollowAllButtonBinder {
fun bind(
view: View,
creatorIds: List<Long>,
isFollowCompleted: Boolean,
onClick: (List<Long>) -> Unit
) {
val icon = view.findViewById<ImageView>(R.id.iv_home_follow_all_icon)
val text = view.findViewById<TextView>(R.id.tv_home_follow_all)
icon.setImageResource(if (isFollowCompleted) R.drawable.ic_new_following else R.drawable.ic_new_follow)
text.setText(
if (isFollowCompleted) {
R.string.home_recommendation_follow_all_done
} else {
R.string.home_recommendation_follow_all
}
)
view.isEnabled = !isFollowCompleted
view.setOnClickListener {
if (creatorIds.isNotEmpty()) onClick(creatorIds)
}
}
}
private fun recyclerItemLayoutParams(parent: ViewGroup): RecyclerView.LayoutParams {
return RecyclerView.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply { marginEnd = parent.resources.getDimensionPixelSize(R.dimen.spacing_12) }
}

View File

@@ -0,0 +1,52 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationRecentlyActiveCreatorUiModel
class HomeRecentActivityCreatorAdapter : RecyclerView.Adapter<HomeRecentActivityCreatorAdapter.CreatorViewHolder>() {
private var items: List<HomeRecommendationRecentlyActiveCreatorUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationRecentlyActiveCreatorUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_activity_creator, parent, false)
view.layoutParams = recyclerItemLayoutParams(parent)
return CreatorViewHolder(view)
}
override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val profileImage = itemView.findViewById<ImageView>(R.id.iv_home_recent_activity_creator_profile)
private val activityTypeText = itemView.findViewById<TextView>(R.id.tv_home_recent_activity_type)
private val titleText = itemView.findViewById<TextView>(R.id.tv_home_recent_activity_title)
private val nicknameText = itemView.findViewById<TextView>(R.id.tv_home_recent_activity_nickname)
fun bind(item: HomeRecommendationRecentlyActiveCreatorUiModel) {
profileImage.loadUrl(item.profileImage)
item.activityLabelResId?.let { labelResId ->
activityTypeText.setText(labelResId)
activityTypeText.visibility = View.VISIBLE
} ?: run {
activityTypeText.visibility = View.GONE
}
titleText.text = item.activityAt.orEmpty()
titleText.visibility = if (item.activityAt.isNullOrBlank()) View.GONE else View.VISIBLE
nicknameText.text = item.nickname
}
}
}

View File

@@ -0,0 +1,42 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.extensions.loadUrl
import kr.co.vividnext.sodalive.v2.main.home.model.HomeRecommendationCreatorUiModel
class HomeRecentDebutCreatorAdapter : RecyclerView.Adapter<HomeRecentDebutCreatorAdapter.CreatorViewHolder>() {
private var items: List<HomeRecommendationCreatorUiModel> = emptyList()
fun submitItems(items: List<HomeRecommendationCreatorUiModel>) {
this.items = items
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CreatorViewHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_home_recent_debut_creator, parent, false)
view.layoutParams = recyclerItemLayoutParams(parent)
return CreatorViewHolder(view)
}
override fun onBindViewHolder(holder: CreatorViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount(): Int = items.size
class CreatorViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val profileImage = itemView.findViewById<ImageView>(R.id.iv_home_recent_debut_creator_profile)
private val nicknameText = itemView.findViewById<TextView>(R.id.tv_home_recent_debut_creator_nickname)
fun bind(item: HomeRecommendationCreatorUiModel) {
profileImage.loadUrl(item.profileImage)
nicknameText.text = item.nickname
}
}
}

View File

@@ -0,0 +1,12 @@
package kr.co.vividnext.sodalive.v2.main.home.ui
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
internal fun recyclerItemLayoutParams(parent: ViewGroup): RecyclerView.LayoutParams {
return RecyclerView.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
).apply { marginEnd = parent.resources.getDimensionPixelSize(R.dimen.spacing_12) }
}