From 66a6f4bbabf263468080a5f1ae835286ad721033 Mon Sep 17 00:00:00 2001 From: klaus Date: Tue, 15 Jul 2025 19:01:29 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A9=94=EC=9D=B8=20=ED=99=88=20-=20?= =?UTF-8?q?=ED=81=90=EB=A0=88=EC=9D=B4=EC=85=98=20UI=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/home/HomeCurationAdapter.kt | 100 ++++++++++++++++++ .../vividnext/sodalive/home/HomeFragment.kt | 59 +++++++++++ .../main/res/layout/item_home_curation.xml | 29 +++++ 3 files changed, 188 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/home/HomeCurationAdapter.kt create mode 100644 app/src/main/res/layout/item_home_curation.xml diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeCurationAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeCurationAdapter.kt new file mode 100644 index 00000000..0a099cf5 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeCurationAdapter.kt @@ -0,0 +1,100 @@ +package kr.co.vividnext.sodalive.home + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Rect +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import kr.co.vividnext.sodalive.audio_content.main.GetAudioContentMainItem +import kr.co.vividnext.sodalive.audio_content.main.v2.GetContentCurationResponse +import kr.co.vividnext.sodalive.databinding.ItemHomeCurationBinding +import kr.co.vividnext.sodalive.extensions.dpToPx + +class HomeCurationAdapter( + private val onClickItem: (Long) -> Unit +) : RecyclerView.Adapter() { + + private val items = mutableListOf() + + inner class ViewHolder( + private val context: Context, + private val binding: ItemHomeCurationBinding + ) : RecyclerView.ViewHolder(binding.root) { + fun bind(item: GetContentCurationResponse) { + binding.tvTitle.text = item.title + setAudioContentList(item.items) + } + + private fun setAudioContentList(audioContents: List) { + val adapter = HomeContentAdapter(onClickItem) + + binding.rvCuration.layoutManager = LinearLayoutManager( + context, + LinearLayoutManager.HORIZONTAL, + false + ) + if (binding.rvCuration.itemDecorationCount == 0) { + binding.rvCuration.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() + } + }) + } + binding.rvCuration.adapter = adapter + adapter.addItems( + audioContents.map { + AudioContentMainItem( + contentId = it.contentId, + creatorId = it.creatorId, + title = it.title, + coverImageUrl = it.coverImageUrl, + creatorNickname = it.creatorNickname, + isPointAvailable = it.isPointAvailable + ) + } + ) + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder( + parent.context, + ItemHomeCurationBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount() = items.size + + @SuppressLint("NotifyDataSetChanged") + fun addItems(items: List) { + this.items.clear() + this.items.addAll(items) + notifyDataSetChanged() + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt index 673d444f..e7001407 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/home/HomeFragment.kt @@ -73,6 +73,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl private lateinit var seriesDayOfWeekAdapter: HomeSeriesAdapter private lateinit var weelyChartAdapter: HomeWeeklyChartAdapter private lateinit var homeFreeContentAdapter: HomeContentAdapter + private lateinit var curationAdapter: HomeCurationAdapter private val handler = Handler(Looper.getMainLooper()) @@ -167,6 +168,7 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl setupSeriesDayOfWeek() setupWeelyChart() setupFreeContent() + setupCuration() } private fun setupLiveView() { @@ -917,6 +919,63 @@ class HomeFragment : BaseFragment(FragmentHomeBinding::infl } } + private fun setupCuration() { + curationAdapter = HomeCurationAdapter( + onClickItem = { + startActivity( + Intent(requireContext(), AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it) + } + ) + } + ) + + binding.rvCuration.layoutManager = LinearLayoutManager( + context, + LinearLayoutManager.VERTICAL, + false + ) + + binding.rvCuration.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.top = 48f.dpToPx().toInt() + outRect.bottom = 24f.dpToPx().toInt() + } + + curationAdapter.itemCount - 1 -> { + outRect.top = 24f.dpToPx().toInt() + outRect.bottom = 48f.dpToPx().toInt() + } + + else -> { + outRect.top = 24f.dpToPx().toInt() + outRect.bottom = 24f.dpToPx().toInt() + } + } + } + }) + + binding.rvCuration.adapter = curationAdapter + + viewModel.curationListLiveData.observe(viewLifecycleOwner) { + if (it.isNotEmpty()) { + binding.rvCuration.visibility = View.VISIBLE + curationAdapter.addItems(it) + } else { + binding.rvCuration.visibility = View.GONE + } + } + } + private fun bindData() { viewModel.isLoading.observe(viewLifecycleOwner) { if (it) { diff --git a/app/src/main/res/layout/item_home_curation.xml b/app/src/main/res/layout/item_home_curation.xml new file mode 100644 index 00000000..c8ae84e8 --- /dev/null +++ b/app/src/main/res/layout/item_home_curation.xml @@ -0,0 +1,29 @@ + + + + + +