fix(home): 홈에 포인트 대여 콘텐츠 섹션 추가 및 데이터 연동

- 무료 콘텐츠 아래 동일 UI로 섹션 추가
- 제목 ‘포인트’ 컬러 강조(무료 섹션과 동일)
- GetHomeResponse.pointAvailableContentList 사용해 데이터 바인딩
- 섹션 우측 ‘전체보기’ 텍스트 추가(클릭 액션 TODO)
This commit is contained in:
2025-11-10 19:38:48 +09:00
parent c35b267658
commit 1bf653a5d8
4 changed files with 120 additions and 0 deletions

View File

@@ -25,5 +25,6 @@ data class GetHomeResponse(
@SerializedName("contentRanking") val contentRanking: List<GetAudioContentRankingItem>,
@SerializedName("recommendChannelList") val recommendChannelList: List<RecommendChannelResponse>,
@SerializedName("freeContentList") val freeContentList: List<AudioContentMainItem>,
@SerializedName("pointAvailableContentList") val pointAvailableContentList: List<AudioContentMainItem>,
@SerializedName("curationList") val curationList: List<GetContentCurationResponse>
)

View File

@@ -86,6 +86,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
private lateinit var weelyChartAdapter: HomeWeeklyChartAdapter
private lateinit var recommendChannelAdapter: HomeRecommendChannelAdapter
private lateinit var homeFreeContentAdapter: HomeContentAdapter
private lateinit var homePointContentAdapter: HomeContentAdapter
private lateinit var curationAdapter: HomeCurationAdapter
private val handler = Handler(Looper.getMainLooper())
@@ -190,6 +191,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
setupWeelyChart()
setupRecommendChannel()
setupFreeContent()
setupPointContent()
setupCuration()
}
@@ -1089,6 +1091,73 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
}
}
private fun setupPointContent() {
val spSectionTitle = SpannableString(binding.tvPointContent.text)
spSectionTitle.setSpan(
ForegroundColorSpan(
ContextCompat.getColor(
requireContext(),
R.color.color_3bb9f1
)
),
0,
3,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
)
binding.tvPointContent.text = spSectionTitle
homePointContentAdapter = HomeContentAdapter {
if (SharedPreferenceManager.token.isNotBlank()) {
startActivity(
Intent(requireContext(), AudioContentDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it)
}
)
} else {
(requireActivity() as MainActivity).showLoginActivity()
}
}
val rvContent = binding.rvPointContent
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) {
outRect.left = 0f.dpToPx().toInt()
} else {
outRect.left = 8f.dpToPx().toInt()
}
outRect.right = 8f.dpToPx().toInt()
}
})
rvContent.adapter = homePointContentAdapter
viewModel.pointAvailableContentListLiveData.observe(viewLifecycleOwner) {
if (it.isNotEmpty()) {
binding.llPointContent.visibility = View.VISIBLE
homePointContentAdapter.addItems(it)
} else {
binding.llPointContent.visibility = View.GONE
}
}
binding.tvPointContentAll.setOnClickListener {
// TODO: 전체보기 클릭 액션은 추후에 추가 예정
}
}
private fun setupCuration() {
curationAdapter = HomeCurationAdapter(
onClickItem = {

View File

@@ -80,6 +80,10 @@ class HomeViewModel(
val curationListLiveData: LiveData<List<GetContentCurationResponse>>
get() = _curationListLiveData
private var _pointAvailableContentListLiveData = MutableLiveData<List<AudioContentMainItem>>()
val pointAvailableContentListLiveData: LiveData<List<AudioContentMainItem>>
get() = _pointAvailableContentListLiveData
fun fetchData() {
_isLoading.value = true
@@ -106,6 +110,7 @@ class HomeViewModel(
_popularCharacters.value = data.popularCharacters
_contentRankingLiveData.value = data.contentRanking
_freeContentListLiveData.value = data.freeContentList
_pointAvailableContentListLiveData.value = data.pointAvailableContentList
_curationListLiveData.value = data.curationList
_recommendChannelListLiveData.value = data.recommendChannelList
} else {

View File

@@ -389,6 +389,51 @@
android:paddingHorizontal="24dp" />
</LinearLayout>
<!-- 포인트 대여 콘텐츠 섹션 -->
<LinearLayout
android:id="@+id/ll_point_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="48dp"
android:orientation="vertical"
android:visibility="gone">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingHorizontal="24dp">
<TextView
android:id="@+id/tv_point_content"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:fontFamily="@font/pretendard_bold"
android:text="포인트 대여 콘텐츠"
android:textColor="@color/white"
android:textSize="24sp" />
<TextView
android:id="@+id/tv_point_content_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/pretendard_regular"
android:text="전체보기"
android:textColor="#90A4AE"
android:textSize="14sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_point_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:clipToPadding="false"
android:paddingHorizontal="24dp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_curation"
android:layout_width="match_parent"