feat: 메인 홈

- 무료 콘텐츠 UI 추가
This commit is contained in:
2025-07-15 18:44:14 +09:00
parent 76b8b74d41
commit a328ea9c3c
2 changed files with 64 additions and 0 deletions

View File

@@ -72,6 +72,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
private lateinit var auditionAdapter: AuditionBannerAdapter private lateinit var auditionAdapter: AuditionBannerAdapter
private lateinit var seriesDayOfWeekAdapter: HomeSeriesAdapter private lateinit var seriesDayOfWeekAdapter: HomeSeriesAdapter
private lateinit var weelyChartAdapter: HomeWeeklyChartAdapter private lateinit var weelyChartAdapter: HomeWeeklyChartAdapter
private lateinit var homeFreeContentAdapter: HomeContentAdapter
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
@@ -165,6 +166,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
setupAudition() setupAudition()
setupSeriesDayOfWeek() setupSeriesDayOfWeek()
setupWeelyChart() setupWeelyChart()
setupFreeContent()
} }
private fun setupLiveView() { private fun setupLiveView() {
@@ -856,6 +858,65 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
} }
} }
private fun setupFreeContent() {
val spSectionTitle = SpannableString(binding.tvFreeContent.text)
spSectionTitle.setSpan(
ForegroundColorSpan(
ContextCompat.getColor(
requireContext(),
R.color.color_3bb9f1
)
),
0,
2,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
binding.tvFreeContent.text = spSectionTitle
homeFreeContentAdapter = HomeContentAdapter {
startActivity(
Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
}
)
}
val rvContent = binding.rvFreeContent
rvContent.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
rvContent.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets(
outRect: Rect,
view: View,
parent: RecyclerView,
state: RecyclerView.State
) {
super.getItemOffsets(outRect, view, parent, state)
outRect.top = 8f.dpToPx().toInt()
outRect.bottom = 8f.dpToPx().toInt()
val position = parent.getChildAdapterPosition(view)
if (position == 0 || position == 1) {
outRect.left = 0f.dpToPx().toInt()
} else {
outRect.left = 8f.dpToPx().toInt()
}
outRect.right = 8f.dpToPx().toInt()
}
})
rvContent.adapter = homeFreeContentAdapter
viewModel.freeContentListLiveData.observe(viewLifecycleOwner) {
if (it.isNotEmpty()) {
binding.llFreeContent.visibility = View.VISIBLE
homeFreeContentAdapter.addItems(it)
} else {
binding.llFreeContent.visibility = View.GONE
}
}
}
private fun bindData() { private fun bindData() {
viewModel.isLoading.observe(viewLifecycleOwner) { viewModel.isLoading.observe(viewLifecycleOwner) {
if (it) { if (it) {

View File

@@ -100,6 +100,9 @@ class HomeViewModel(private val repository: HomeRepository) : BaseViewModel() {
_auditionListLiveData.value = data.auditionList _auditionListLiveData.value = data.auditionList
_dayOfWeekSeriesListLiveData.value = data.dayOfWeekSeriesList _dayOfWeekSeriesListLiveData.value = data.dayOfWeekSeriesList
_contentRankingLiveData.value = data.contentRanking _contentRankingLiveData.value = data.contentRanking
_freeContentListLiveData.value = data.freeContentList
_curationListLiveData.value = data.curationList
_recommendChannelListLiveData.value = data.recommendChannelList
} else { } else {
if (it.message != null) { if (it.message != null) {
_toastLiveData.postValue(it.message) _toastLiveData.postValue(it.message)