feat: 메인 홈

- 오직 보이스온에서만 UI 추가
This commit is contained in:
2025-07-15 16:08:25 +09:00
parent ccc774da0d
commit af818bda93
7 changed files with 306 additions and 1 deletions

View File

@@ -67,7 +67,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
private lateinit var homeContentAdapter: HomeContentAdapter
private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
private lateinit var seriesAdapter: HomeSeriesAdapter
private lateinit var originalSeriesAdapter: HomeSeriesAdapter
private val handler = Handler(Looper.getMainLooper())
@@ -157,6 +157,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
setupSectionCreator()
setupLatestContent()
setupContentBanner()
setupOriginalSeries()
}
private fun setupLiveView() {
@@ -525,6 +526,73 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}
}
private fun setupOriginalSeries() {
val spSectionTitle = SpannableString(binding.tvSeriesOriginal.text)
spSectionTitle.setSpan(
ForegroundColorSpan(
ContextCompat.getColor(
requireContext(),
R.color.color_3bb9f1
)
),
0,
2,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
binding.tvSeriesOriginal.text = spSectionTitle
originalSeriesAdapter = HomeSeriesAdapter {
startActivity(
Intent(requireContext(), SeriesDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_SERIES_ID, it)
}
)
}
val recyclerView = binding.rvSeriesOriginal
recyclerView.layoutManager = LinearLayoutManager(
context,
LinearLayoutManager.HORIZONTAL,
false
)
recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
when (parent.getChildAdapterPosition(view)) {
0 -> {
outRect.left = 0
outRect.right = 8f.dpToPx().toInt()
}
originalSeriesAdapter.itemCount - 1 -> {
outRect.left = 8f.dpToPx().toInt()
outRect.right = 0
}
else -> {
outRect.left = 8f.dpToPx().toInt()
outRect.right = 8f.dpToPx().toInt()
}
}
}
})
recyclerView.adapter = originalSeriesAdapter
viewModel.originalAudioDramaListLiveData.observe(viewLifecycleOwner) {
if (it.isNotEmpty()) {
binding.llSeriesOriginal.visibility = View.VISIBLE
originalSeriesAdapter.addItems(it)
} else {
binding.llSeriesOriginal.visibility = View.GONE
}
}
}
private fun bindData() {
viewModel.isLoading.observe(viewLifecycleOwner) {
if (it) {

View File

@@ -0,0 +1,89 @@
package kr.co.vividnext.sodalive.home
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
import kr.co.vividnext.sodalive.databinding.ItemHomeSeriesBinding
import kr.co.vividnext.sodalive.extensions.dpToPx
class HomeSeriesAdapter(
private val onClickItem: (Long) -> Unit
) : RecyclerView.Adapter<HomeSeriesAdapter.ViewHolder>() {
val items = mutableListOf<GetSeriesListResponse.SeriesListItem>()
inner class ViewHolder(
private val context: Context,
private val binding: ItemHomeSeriesBinding
) : RecyclerView.ViewHolder(binding.root) {
@SuppressLint("SetTextI18n")
fun bind(item: GetSeriesListResponse.SeriesListItem) {
Glide
.with(context)
.load(item.coverImage)
.apply(
RequestOptions().transform(
CenterCrop(),
RoundedCorners(16f.dpToPx().toInt())
)
)
.into(binding.ivCover)
binding.tvTitle.text = item.title
binding.tvNickname.text = item.creator.nickname
binding.tvSeriesContentCount.text = "${item.numberOfContent}"
binding.tvNew.visibility = if (item.isNew) {
View.VISIBLE
} else {
View.GONE
}
binding.tvPopular.visibility = if (item.isPopular) {
View.VISIBLE
} else {
View.GONE
}
if (item.isComplete) {
binding.tvComplete.visibility = View.VISIBLE
} else {
binding.tvComplete.visibility = View.GONE
}
binding.root.setOnClickListener { onClickItem(item.seriesId) }
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
parent.context,
ItemHomeSeriesBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
override fun getItemCount() = items.count()
@SuppressLint("NotifyDataSetChanged")
fun addItems(items: List<GetSeriesListResponse.SeriesListItem>) {
this.items.addAll(items)
notifyDataSetChanged()
}
fun isVisibleRecyclerView(): Boolean {
return items.isNotEmpty()
}
}