지금 라이브중 전체보기 UI를 라이브 탭과 동일하게 변경

라이브 카드에 19금 방 안내 shield 표시
This commit is contained in:
2026-02-03 10:38:00 +09:00
parent d13769861d
commit ff1281abde
5 changed files with 56 additions and 64 deletions

View File

@@ -45,6 +45,12 @@ class LiveNowAdapter(
View.GONE View.GONE
} }
binding.ivShield.visibility = if (item.isAdult) {
View.VISIBLE
} else {
View.GONE
}
if (item.price > 0) { if (item.price > 0) {
binding.llCan.visibility = View.VISIBLE binding.llCan.visibility = View.VISIBLE
binding.tvCan.text = item.price.moneyFormat() binding.tvCan.text = item.price.moneyFormat()

View File

@@ -9,6 +9,7 @@ import androidx.media3.common.util.UnstableApi
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService import kr.co.vividnext.sodalive.audio_content.AudioContentPlayService
import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService import kr.co.vividnext.sodalive.audio_content.player.AudioContentPlayerService
import kr.co.vividnext.sodalive.base.BaseActivity import kr.co.vividnext.sodalive.base.BaseActivity
@@ -17,7 +18,7 @@ import kr.co.vividnext.sodalive.common.GridSpacingItemDecoration
import kr.co.vividnext.sodalive.common.LoadingDialog import kr.co.vividnext.sodalive.common.LoadingDialog
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.ActivityLiveNowAllBinding import kr.co.vividnext.sodalive.databinding.ActivityLiveNowAllBinding
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.live.LiveViewModel import kr.co.vividnext.sodalive.live.LiveViewModel
import kr.co.vividnext.sodalive.live.room.LiveRoomActivity import kr.co.vividnext.sodalive.live.room.LiveRoomActivity
import kr.co.vividnext.sodalive.live.room.detail.LiveRoomDetailFragment import kr.co.vividnext.sodalive.live.room.detail.LiveRoomDetailFragment
@@ -53,7 +54,7 @@ class LiveNowAllActivity : BaseActivity<ActivityLiveNowAllBinding>(
loadingDialog = LoadingDialog(this, layoutInflater) loadingDialog = LoadingDialog(this, layoutInflater)
val spanCount = 2 val spanCount = 2
val spacing = 48 val spacing = 16.dpToPx().toInt()
val recyclerView = binding.rvLive val recyclerView = binding.rvLive
adapter = LiveNowAllAdapter(itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 2) { adapter = LiveNowAllAdapter(itemWidth = (screenWidth - (spacing * (spanCount + 1))) / 2) {
val detailFragment = LiveRoomDetailFragment( val detailFragment = LiveRoomDetailFragment(

View File

@@ -2,26 +2,18 @@ package kr.co.vividnext.sodalive.live.now.all
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.Bitmap
import android.graphics.drawable.Drawable
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import coil.transform.CircleCropTransformation
import coil.transform.RoundedCornersTransformation
import com.bumptech.glide.Glide import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.RequestOptions
import com.bumptech.glide.request.target.CustomTarget import kr.co.vividnext.sodalive.databinding.ItemLiveNowBinding
import com.bumptech.glide.request.transition.Transition
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.databinding.ItemLiveNowAllBinding
import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.extensions.loadUrl import kr.co.vividnext.sodalive.extensions.moneyFormat
import kr.co.vividnext.sodalive.live.GetRoomListResponse import kr.co.vividnext.sodalive.live.GetRoomListResponse
import kotlin.math.roundToInt
class LiveNowAllAdapter( class LiveNowAllAdapter(
private val itemWidth: Int, private val itemWidth: Int,
@@ -32,25 +24,38 @@ class LiveNowAllAdapter(
inner class ViewHolder( inner class ViewHolder(
private val context: Context, private val context: Context,
private val binding: ItemLiveNowAllBinding private val binding: ItemLiveNowBinding
) : RecyclerView.ViewHolder(binding.root) { ) : RecyclerView.ViewHolder(binding.root) {
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
fun bind(item: GetRoomListResponse) { fun bind(item: GetRoomListResponse) {
val baseCardWidth = 144.dpToPx()
val baseCardHeight = 204.dpToPx()
val scale = itemWidth / baseCardWidth
val rootLayoutParams = binding.root.layoutParams
rootLayoutParams.width = itemWidth
rootLayoutParams.height = (baseCardHeight * scale).roundToInt()
binding.root.layoutParams = rootLayoutParams
val profileLayoutParams = binding.flProfile.layoutParams
profileLayoutParams.width = (84.dpToPx() * scale).roundToInt()
profileLayoutParams.height = (84.dpToPx() * scale).roundToInt()
binding.flProfile.layoutParams = profileLayoutParams
val profileImageLayoutParams = binding.ivProfile.layoutParams
profileImageLayoutParams.width = (72.dpToPx() * scale).roundToInt()
profileImageLayoutParams.height = (72.dpToPx() * scale).roundToInt()
binding.ivProfile.layoutParams = profileImageLayoutParams
Glide Glide
.with(context) .with(context)
.load(item.coverImageUrl) .load(item.creatorProfileImage)
.apply( .apply(
RequestOptions().transform( RequestOptions().transform(
CenterCrop(), CircleCrop()
RoundedCorners(14)
) )
) )
.into(binding.ivCover) .into(binding.ivProfile)
val layoutParams = binding.ivCover
.layoutParams as ConstraintLayout.LayoutParams
layoutParams.width = itemWidth
layoutParams.height = itemWidth * 144 / 102
binding.ivLock.visibility = if (item.isPrivateRoom) { binding.ivLock.visibility = if (item.isPrivateRoom) {
View.VISIBLE View.VISIBLE
@@ -58,53 +63,23 @@ class LiveNowAllAdapter(
View.GONE View.GONE
} }
if (item.price > 0) { binding.ivShield.visibility = if (item.isAdult) {
binding.tvPrice.text = "${item.price}" View.VISIBLE
binding.tvPrice.setCompoundDrawablesWithIntrinsicBounds(
R.drawable.ic_can_white,
0,
0,
0
)
binding.tvPrice.setBackgroundResource(R.drawable.bg_round_corner_13_3_dd4500)
} else { } else {
binding.tvPrice.text = context.getString(R.string.screen_live_now_all_free) View.GONE
binding.tvPrice.setCompoundDrawables(null, null, null, null)
binding.tvPrice.setBackgroundResource(R.drawable.bg_round_corner_13_3_111111)
} }
if (item.tags.isNotEmpty()) { if (item.price > 0) {
binding.tvTags.visibility = View.VISIBLE binding.llCan.visibility = View.VISIBLE
binding.tvTags.text = item.tags.joinToString(" ") { "#$it" } binding.tvCan.text = item.price.moneyFormat()
binding.tvFree.visibility = View.GONE
} else { } else {
binding.tvTags.visibility = View.GONE binding.llCan.visibility = View.GONE
binding.tvFree.visibility = View.VISIBLE
} }
binding.tvTitle.text = item.title binding.tvTitle.text = item.title
binding.tvNickname.text = item.creatorNickname binding.tvNickname.text = item.creatorNickname
binding.ivProfile.loadUrl(item.creatorProfileImage) {
crossfade(true)
placeholder(R.drawable.ic_place_holder)
transformations(CircleCropTransformation())
}
if (item.numberOfPeople - item.numberOfParticipate <= 2) {
binding.llRemainingParticipant.visibility = View.VISIBLE
if (item.numberOfPeople > item.numberOfParticipate) {
binding.tvRemainingParticipantNumber.visibility = View.VISIBLE
binding.tvRemainingParticipant.text =
context.getString(R.string.screen_live_now_all_remaining)
binding.tvRemainingParticipantNumber.text =
"${item.numberOfPeople - item.numberOfParticipate}"
} else {
binding.tvRemainingParticipantNumber.visibility = View.GONE
binding.tvRemainingParticipant.text =
context.getString(R.string.screen_live_now_all_sold_out)
binding.tvRemainingParticipantNumber.text = ""
}
} else {
binding.llRemainingParticipant.visibility = View.GONE
}
binding.root.setOnClickListener { onClick(item) } binding.root.setOnClickListener { onClick(item) }
} }
@@ -112,7 +87,7 @@ class LiveNowAllAdapter(
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
parent.context, parent.context,
ItemLiveNowAllBinding.inflate( ItemLiveNowBinding.inflate(
LayoutInflater.from(parent.context), LayoutInflater.from(parent.context),
parent, parent,
false false

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

View File

@@ -22,6 +22,16 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<ImageView
android:id="@+id/iv_shield"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@null"
android:src="@drawable/ic_shield"
android:visibility="gone"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- 프로필 이미지 컨테이너 --> <!-- 프로필 이미지 컨테이너 -->
<FrameLayout <FrameLayout
android:id="@+id/fl_profile" android:id="@+id/fl_profile"