From fe1a1cc3cbe6a3f6bf8f457df43828e36d08b6c0 Mon Sep 17 00:00:00 2001 From: klaus Date: Sun, 15 Oct 2023 03:07:37 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20-=20=EC=9D=B8=EA=B8=B0=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EC=98=81=EC=97=AD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/AudioContentMainFragment.kt | 47 +++++++++++++ .../main/AudioContentMainRankingAdapter.kt | 60 +++++++++++++++++ .../main/AudioContentMainViewModel.kt | 5 ++ .../main/GetAudioContentMainResponse.kt | 20 +++++- .../layout/fragment_audio_content_main.xml | 67 +++++++++++++++++++ .../item_audio_content_main_ranking.xml | 50 ++++++++++++++ 6 files changed, 248 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainRankingAdapter.kt create mode 100644 app/src/main/res/layout/item_audio_content_main_ranking.xml diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainFragment.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainFragment.kt index b763884..3817dce 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainFragment.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainFragment.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.audio_content.main +import android.annotation.SuppressLint import android.app.Service import android.content.Intent import android.graphics.Rect @@ -10,6 +11,7 @@ import android.view.inputmethod.InputMethodManager import android.widget.LinearLayout import android.widget.Toast import androidx.core.content.ContextCompat +import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.zhpan.bannerview.BaseBannerAdapter @@ -47,6 +49,7 @@ class AudioContentMainFragment : BaseFragment( private lateinit var orderListAdapter: AudioContentMainContentAdapter private lateinit var newContentThemeAdapter: AudioContentMainNewContentThemeAdapter private lateinit var newContentAdapter: AudioContentMainContentAdapter + private lateinit var contentRankingAdapter: AudioContentMainRankingAdapter private lateinit var curationAdapter: AudioContentMainCurationAdapter override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -83,6 +86,7 @@ class AudioContentMainFragment : BaseFragment( setupOrderList() setupNewContentTheme() setupNewContent() + setupContentRanking() setupCuration() binding.swipeRefreshLayout.setOnRefreshListener { @@ -362,6 +366,42 @@ class AudioContentMainFragment : BaseFragment( binding.rvNewContent.adapter = newContentAdapter } + private fun setupContentRanking() { + binding.ivContentRankingAll.setOnClickListener {} + + contentRankingAdapter = AudioContentMainRankingAdapter { + startActivity( + Intent(requireContext(), AudioContentDetailActivity::class.java).apply { + putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, it) + } + ) + } + + binding.rvContentRanking.layoutManager = GridLayoutManager( + context, + 3, + GridLayoutManager.HORIZONTAL, + false + ) + + binding.rvContentRanking.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.top = 13.3f.dpToPx().toInt() + outRect.bottom = 13.3f.dpToPx().toInt() + outRect.left = 13.3f.dpToPx().toInt() + outRect.right = 13.3f.dpToPx().toInt() + } + }) + + binding.rvContentRanking.adapter = contentRankingAdapter + } + private fun setupCuration() { curationAdapter = AudioContentMainCurationAdapter( onClickItem = { @@ -425,6 +465,7 @@ class AudioContentMainFragment : BaseFragment( binding.rvCuration.adapter = curationAdapter } + @SuppressLint("SetTextI18n") private fun bindData() { viewModel.isLoading.observe(viewLifecycleOwner) { if (it) { @@ -490,5 +531,11 @@ class AudioContentMainFragment : BaseFragment( View.VISIBLE } } + + viewModel.contentRankingLiveData.observe(viewLifecycleOwner) { + binding.llContentRanking.visibility = View.VISIBLE + binding.tvDate.text = "${it.startDate}~${it.endDate}" + contentRankingAdapter.addItems(it.items) + } } } diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainRankingAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainRankingAdapter.kt new file mode 100644 index 0000000..7b361dc --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainRankingAdapter.kt @@ -0,0 +1,60 @@ +package kr.co.vividnext.sodalive.audio_content.main + +import android.annotation.SuppressLint +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import coil.load +import coil.transform.RoundedCornersTransformation +import kr.co.vividnext.sodalive.R +import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainRankingBinding +import kr.co.vividnext.sodalive.extensions.dpToPx + +class AudioContentMainRankingAdapter( + private val onClickItem: (Long) -> Unit +) : RecyclerView.Adapter() { + + inner class AudioContentMainRankingItemViewHolder( + private val binding: ItemAudioContentMainRankingBinding + ) : RecyclerView.ViewHolder(binding.root) { + @SuppressLint("SetTextI18n") + fun bind(item: GetAudioContentRankingItem, index: Int) { + binding.root.setOnClickListener { onClickItem(item.contentId) } + binding.tvTitle.text = item.title + binding.tvRank.text = "${index + 1}" + binding.tvNickname.text = item.creatorNickname + + binding.ivCover.load(item.coverImageUrl) { + crossfade(true) + placeholder(R.drawable.ic_place_holder) + transformations(RoundedCornersTransformation(2.7f.dpToPx())) + } + } + } + + private val items = mutableListOf() + + @SuppressLint("NotifyDataSetChanged") + fun addItems(items: List) { + this.items.clear() + this.items.addAll(items) + notifyDataSetChanged() + } + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ) = AudioContentMainRankingItemViewHolder( + ItemAudioContentMainRankingBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + override fun getItemCount() = items.size + + override fun onBindViewHolder(holder: AudioContentMainRankingItemViewHolder, position: Int) { + holder.bind(items[position], index = position) + } +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainViewModel.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainViewModel.kt index 922d42f..a2a3656 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainViewModel.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/AudioContentMainViewModel.kt @@ -45,6 +45,10 @@ class AudioContentMainViewModel( val curationListLiveData: LiveData> get() = _curationListLiveData + private var _contentRankingLiveData = MutableLiveData() + val contentRankingLiveData: LiveData + get() = _contentRankingLiveData + fun getMain() { _isLoading.value = true compositeDisposable.add( @@ -61,6 +65,7 @@ class AudioContentMainViewModel( _orderListLiveData.value = data.orderList _bannerLiveData.value = data.bannerList _curationListLiveData.value = data.curationList + _contentRankingLiveData.value = data.contentRanking val themeList = listOf("전체").union(data.themeList).toList() _themeListLiveData.value = themeList diff --git a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt index 2781910..2b010cb 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/audio_content/main/GetAudioContentMainResponse.kt @@ -10,7 +10,8 @@ data class GetAudioContentMainResponse( @SerializedName("orderList") val orderList: List, @SerializedName("themeList") val themeList: List, @SerializedName("newContentList") val newContentList: List, - @SerializedName("curationList") val curationList: List + @SerializedName("curationList") val curationList: List, + @SerializedName("contentRanking") val contentRanking: GetAudioContentRanking ) data class GetNewContentUploadCreator( @@ -29,6 +30,23 @@ data class GetAudioContentMainItem( @SerializedName("creatorNickname") val creatorNickname: String ) +data class GetAudioContentRanking( + @SerializedName("startDate") val startDate: String, + @SerializedName("endDate") val endDate: String, + @SerializedName("items") val items: List +) + +data class GetAudioContentRankingItem( + @SerializedName("contentId") val contentId: Long, + @SerializedName("title") val title: String, + @SerializedName("coverImageUrl") val coverImageUrl: String, + @SerializedName("themeStr") val themeStr: String, + @SerializedName("price") val price: Int, + @SerializedName("duration") val duration: String, + @SerializedName("creatorId") val creatorId: Long, + @SerializedName("creatorNickname") val creatorNickname: String +) + data class GetAudioContentCurationResponse( @SerializedName("curationId") val curationId: Long, @SerializedName("title") val title: String, diff --git a/app/src/main/res/layout/fragment_audio_content_main.xml b/app/src/main/res/layout/fragment_audio_content_main.xml index 3b64aa2..e5ba0e6 100644 --- a/app/src/main/res/layout/fragment_audio_content_main.xml +++ b/app/src/main/res/layout/fragment_audio_content_main.xml @@ -158,6 +158,73 @@ android:paddingHorizontal="13.3dp" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +