콘텐츠 메인

- 추천 시리즈 UI 추가
This commit is contained in:
klaus 2024-05-07 16:42:14 +09:00
parent dff4c833f1
commit 254a1e3381
9 changed files with 315 additions and 341 deletions

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
</SelectionState>
</selectionStates>
</component>
</project>

View File

@ -1,19 +1,18 @@
package kr.co.vividnext.sodalive.audio_content.main package kr.co.vividnext.sodalive.audio_content.main
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Service
import android.content.Intent import android.content.Intent
import android.graphics.Rect import android.graphics.Rect
import android.net.Uri import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.view.View import android.view.View
import android.view.inputmethod.InputMethodManager
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.Toast import android.widget.Toast
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import com.orhanobut.logger.Logger
import com.zhpan.bannerview.BaseBannerAdapter import com.zhpan.bannerview.BaseBannerAdapter
import com.zhpan.indicator.enums.IndicatorSlideMode import com.zhpan.indicator.enums.IndicatorSlideMode
import com.zhpan.indicator.enums.IndicatorStyle import com.zhpan.indicator.enums.IndicatorStyle
@ -29,18 +28,19 @@ import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCura
import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCurationViewModel import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCurationViewModel
import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentThemeAdapter
import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentViewModel import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentViewModel
import kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator.AudioContentMainNewContentCreatorAdapter
import kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator.AudioContentMainNewContentCreatorViewModel
import kr.co.vividnext.sodalive.audio_content.main.order.AudioContentMainOrderListViewModel import kr.co.vividnext.sodalive.audio_content.main.order.AudioContentMainOrderListViewModel
import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingAdapter
import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingViewModel import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingViewModel
import kr.co.vividnext.sodalive.audio_content.main.recommend_series.AudioContentMainRecommendSeriesViewModel
import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListActivity import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListActivity
import kr.co.vividnext.sodalive.audio_content.series.detail.SeriesDetailActivity
import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity import kr.co.vividnext.sodalive.audio_content.upload.AudioContentUploadActivity
import kr.co.vividnext.sodalive.base.BaseFragment import kr.co.vividnext.sodalive.base.BaseFragment
import kr.co.vividnext.sodalive.common.Constants import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainBinding import kr.co.vividnext.sodalive.databinding.FragmentAudioContentMainBinding
import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity import kr.co.vividnext.sodalive.explorer.profile.UserProfileActivity
import kr.co.vividnext.sodalive.explorer.profile.series.UserProfileSeriesListAdapter
import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.settings.event.EventDetailActivity import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
import kr.co.vividnext.sodalive.settings.notification.MemberRole import kr.co.vividnext.sodalive.settings.notification.MemberRole
@ -50,8 +50,8 @@ import kotlin.math.roundToInt
class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>( class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>(
FragmentAudioContentMainBinding::inflate FragmentAudioContentMainBinding::inflate
) { ) {
private val newContentCreatorViewModel: AudioContentMainNewContentCreatorViewModel by inject() private val recommendSeriesViewModel: AudioContentMainRecommendSeriesViewModel by inject()
private lateinit var newContentCreatorAdapter: AudioContentMainNewContentCreatorAdapter private lateinit var seriesAdapter: UserProfileSeriesListAdapter
private val bannerViewModel: AudioContentMainBannerViewModel by inject() private val bannerViewModel: AudioContentMainBannerViewModel by inject()
private lateinit var bannerAdapter: AudioContentMainBannerAdapter private lateinit var bannerAdapter: AudioContentMainBannerAdapter
@ -80,7 +80,7 @@ class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>(
newContentViewModel.getNewContentOfTheme("전체") newContentViewModel.getNewContentOfTheme("전체")
contentRankingViewModel.getContentRanking() contentRankingViewModel.getContentRanking()
contentRankingViewModel.getContentRankingSortType() contentRankingViewModel.getContentRankingSortType()
newContentCreatorViewModel.getNewContentUploadCreatorList() recommendSeriesViewModel.getRecommendSeriesList()
} }
private fun setupView() { private fun setupView() {
@ -98,7 +98,7 @@ class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>(
binding.llUploadContent.visibility = View.GONE binding.llUploadContent.visibility = View.GONE
} }
setupNewContentCreator() setupRecommendSeries()
setupBanner() setupBanner()
setupOrderList() setupOrderList()
setupNewContentTheme() setupNewContentTheme()
@ -107,17 +107,6 @@ class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>(
setupContentRanking() setupContentRanking()
setupCuration() setupCuration()
binding.swipeRefreshLayout.setOnRefreshListener {
binding.swipeRefreshLayout.isRefreshing = false
curationViewModel.refresh()
bannerViewModel.getMainBannerList()
newContentViewModel.getThemeList()
newContentViewModel.getNewContentOfTheme("전체")
contentRankingViewModel.getContentRanking()
contentRankingViewModel.getContentRankingSortType()
newContentCreatorViewModel.getNewContentUploadCreatorList()
}
binding.llShortPlay.setOnClickListener { binding.llShortPlay.setOnClickListener {
startActivity( startActivity(
Intent(requireContext(), AudioContentAllByThemeActivity::class.java).apply { Intent(requireContext(), AudioContentAllByThemeActivity::class.java).apply {
@ -135,20 +124,33 @@ class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>(
} }
} }
private fun setupNewContentCreator() { private fun setupRecommendSeries() {
newContentCreatorAdapter = AudioContentMainNewContentCreatorAdapter { seriesAdapter = UserProfileSeriesListAdapter(
val intent = Intent(requireContext(), UserProfileActivity::class.java) onClickItem = {
intent.putExtra(Constants.EXTRA_USER_ID, it) startActivity(
startActivity(intent) Intent(requireContext(), SeriesDetailActivity::class.java).apply {
} putExtra(Constants.EXTRA_SERIES_ID, it)
}
)
},
onClickCreator = {
startActivity(
Intent(requireContext(), UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, it)
}
)
},
isVisibleCreator = true
)
binding.rvNewContentCreator.layoutManager = LinearLayoutManager( val recyclerView = binding.rvRecommendSeries
context, recyclerView.layoutManager = LinearLayoutManager(
requireContext(),
LinearLayoutManager.HORIZONTAL, LinearLayoutManager.HORIZONTAL,
false false
) )
binding.rvNewContentCreator.addItemDecoration(object : RecyclerView.ItemDecoration() { recyclerView.addItemDecoration(object : RecyclerView.ItemDecoration() {
override fun getItemOffsets( override fun getItemOffsets(
outRect: Rect, outRect: Rect,
view: View, view: View,
@ -160,28 +162,28 @@ class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>(
when (parent.getChildAdapterPosition(view)) { when (parent.getChildAdapterPosition(view)) {
0 -> { 0 -> {
outRect.left = 0 outRect.left = 0
outRect.right = 10.7f.dpToPx().toInt() outRect.right = 6.7f.dpToPx().toInt()
} }
newContentCreatorAdapter.itemCount - 1 -> { seriesAdapter.itemCount - 1 -> {
outRect.left = 10.7f.dpToPx().toInt()
outRect.right = 0 outRect.right = 0
outRect.left = 6.7f.dpToPx().toInt()
} }
else -> { else -> {
outRect.left = 10.7f.dpToPx().toInt() outRect.left = 6.7f.dpToPx().toInt()
outRect.right = 10.7f.dpToPx().toInt() outRect.right = 6.7f.dpToPx().toInt()
} }
} }
} }
}) })
binding.rvNewContentCreator.adapter = newContentCreatorAdapter recyclerView.adapter = seriesAdapter
newContentCreatorViewModel.newContentUploadCreatorListLiveData.observe(viewLifecycleOwner) { recommendSeriesViewModel.seriesListLiveData.observe(viewLifecycleOwner) {
newContentCreatorAdapter.addItems(it) seriesAdapter.addItems(it)
binding.rvNewContentCreator.visibility = if ( binding.llRecommendSeries.visibility = if (
newContentCreatorAdapter.itemCount <= 0 && it.isEmpty() seriesAdapter.itemCount <= 0 && it.isEmpty()
) { ) {
View.GONE View.GONE
} else { } else {
@ -189,7 +191,7 @@ class AudioContentMainFragment : BaseFragment<FragmentAudioContentMainBinding>(
} }
} }
newContentCreatorViewModel.toastLiveData.observe(viewLifecycleOwner) { recommendSeriesViewModel.toastLiveData.observe(viewLifecycleOwner) {
it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() } it?.let { Toast.makeText(requireContext(), it, Toast.LENGTH_LONG).show() }
} }
} }

View File

@ -1,53 +0,0 @@
package kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import coil.load
import coil.transform.CircleCropTransformation
import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.main.GetNewContentUploadCreator
import kr.co.vividnext.sodalive.databinding.ItemAudioContentMainNewContentCreatorBinding
class AudioContentMainNewContentCreatorAdapter(
private val onClickItem: (Long) -> Unit
) : RecyclerView.Adapter<AudioContentMainNewContentCreatorAdapter.ViewHolder>() {
private val items = mutableListOf<GetNewContentUploadCreator>()
inner class ViewHolder(
private val binding: ItemAudioContentMainNewContentCreatorBinding
) : RecyclerView.ViewHolder(binding.root) {
fun bind(item: GetNewContentUploadCreator) {
binding.tvNewContentCreator.text = item.creatorNickname
binding.ivNewContentCreator.load(item.creatorProfileImageUrl) {
crossfade(true)
placeholder(R.drawable.ic_place_holder)
transformations(CircleCropTransformation())
}
binding.root.setOnClickListener { onClickItem(item.creatorId) }
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
ItemAudioContentMainNewContentCreatorBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
)
override fun getItemCount() = items.size
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(items[position])
}
@SuppressLint("NotifyDataSetChanged")
fun addItems(items: List<GetNewContentUploadCreator>) {
this.items.clear()
this.items.addAll(items)
notifyDataSetChanged()
}
}

View File

@ -1,44 +1,42 @@
package kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator package kr.co.vividnext.sodalive.audio_content.main.recommend_series
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.orhanobut.logger.Logger import com.orhanobut.logger.Logger
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.schedulers.Schedulers
import kr.co.vividnext.sodalive.audio_content.AudioContentRepository import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
import kr.co.vividnext.sodalive.audio_content.main.GetNewContentUploadCreator import kr.co.vividnext.sodalive.audio_content.series.SeriesRepository
import kr.co.vividnext.sodalive.base.BaseViewModel import kr.co.vividnext.sodalive.base.BaseViewModel
import kr.co.vividnext.sodalive.common.SharedPreferenceManager import kr.co.vividnext.sodalive.common.SharedPreferenceManager
class AudioContentMainNewContentCreatorViewModel( class AudioContentMainRecommendSeriesViewModel(
private val repository: AudioContentRepository private val repository: SeriesRepository
) : BaseViewModel() { ) : BaseViewModel() {
private val _toastLiveData = MutableLiveData<String?>() private val _toastLiveData = MutableLiveData<String?>()
val toastLiveData: LiveData<String?> val toastLiveData: LiveData<String?>
get() = _toastLiveData get() = _toastLiveData
private var _newContentUploadCreatorListLiveData = private var _seriesListLiveData = MutableLiveData<List<GetSeriesListResponse.SeriesListItem>>()
MutableLiveData<List<GetNewContentUploadCreator>>() val seriesListLiveData: LiveData<List<GetSeriesListResponse.SeriesListItem>>
val newContentUploadCreatorListLiveData: LiveData<List<GetNewContentUploadCreator>> get() = _seriesListLiveData
get() = _newContentUploadCreatorListLiveData
fun getNewContentUploadCreatorList() { fun getRecommendSeriesList() {
compositeDisposable.add( compositeDisposable.add(
repository.getNewContentUploadCreatorList( repository
token = "Bearer ${SharedPreferenceManager.token}" .getRecommendSeriesList(token = "Bearer ${SharedPreferenceManager.token}")
)
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe( .subscribe(
{ {
if (it.success && it.data != null) { if (it.success && it.data != null) {
_newContentUploadCreatorListLiveData.postValue(it.data!!) _seriesListLiveData.value = it.data!!
} else { } else {
if (it.message != null) { if (it.message != null) {
_toastLiveData.postValue(it.message) _toastLiveData.postValue(it.message)
} else { } else {
_toastLiveData.postValue( _toastLiveData.postValue(
"크리에이터 리스트를 불러오지 못했습니다. 다시 시도해 주세요.\n" + "추천 시리즈를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
"계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
) )
} }
@ -47,7 +45,7 @@ class AudioContentMainNewContentCreatorViewModel(
{ {
it.message?.let { message -> Logger.e(message) } it.message?.let { message -> Logger.e(message) }
_toastLiveData.postValue( _toastLiveData.postValue(
"크리에이터 리스트를 불러오지 못했습니다. 다시 시도해 주세요.\n" + "추천 시리즈를 불러오지 못했습니다. 다시 시도해 주세요.\n" +
"계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다." "계속 같은 문제가 발생할 경우 고객센터로 문의 주시기 바랍니다."
) )
} }

View File

@ -32,4 +32,9 @@ interface SeriesApi {
@Query("size") size: Int, @Query("size") size: Int,
@Header("Authorization") authHeader: String @Header("Authorization") authHeader: String
): Single<ApiResponse<GetSeriesContentListResponse>> ): Single<ApiResponse<GetSeriesContentListResponse>>
@GET("/audio-content/series/recommend")
fun getRecommendSeriesList(
@Header("Authorization") authHeader: String
): Single<ApiResponse<List<GetSeriesListResponse.SeriesListItem>>>
} }

View File

@ -31,4 +31,6 @@ class SeriesRepository(private val api: SeriesApi) {
size = size, size = size,
authHeader = token authHeader = token
) )
fun getRecommendSeriesList(token: String) = api.getRecommendSeriesList(authHeader = token)
} }

View File

@ -19,9 +19,9 @@ import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailViewModel
import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerViewModel import kr.co.vividnext.sodalive.audio_content.main.banner.AudioContentMainBannerViewModel
import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCurationViewModel import kr.co.vividnext.sodalive.audio_content.main.curation.AudioContentMainCurationViewModel
import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentViewModel import kr.co.vividnext.sodalive.audio_content.main.new_content.AudioContentMainNewContentViewModel
import kr.co.vividnext.sodalive.audio_content.main.new_content_upload_creator.AudioContentMainNewContentCreatorViewModel
import kr.co.vividnext.sodalive.audio_content.main.order.AudioContentMainOrderListViewModel import kr.co.vividnext.sodalive.audio_content.main.order.AudioContentMainOrderListViewModel
import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingViewModel import kr.co.vividnext.sodalive.audio_content.main.ranking.AudioContentMainRankingViewModel
import kr.co.vividnext.sodalive.audio_content.main.recommend_series.AudioContentMainRecommendSeriesViewModel
import kr.co.vividnext.sodalive.audio_content.modify.AudioContentModifyViewModel import kr.co.vividnext.sodalive.audio_content.modify.AudioContentModifyViewModel
import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListViewModel import kr.co.vividnext.sodalive.audio_content.order.AudioContentOrderListViewModel
import kr.co.vividnext.sodalive.audio_content.series.SeriesApi import kr.co.vividnext.sodalive.audio_content.series.SeriesApi
@ -220,7 +220,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
viewModel { AudioContentMainCurationViewModel(get()) } viewModel { AudioContentMainCurationViewModel(get()) }
viewModel { AudioContentMainOrderListViewModel(get()) } viewModel { AudioContentMainOrderListViewModel(get()) }
viewModel { AudioContentMainNewContentViewModel(get()) } viewModel { AudioContentMainNewContentViewModel(get()) }
viewModel { AudioContentMainNewContentCreatorViewModel(get()) } viewModel { AudioContentMainRecommendSeriesViewModel(get()) }
viewModel { AudioContentViewModel(get()) } viewModel { AudioContentViewModel(get()) }
viewModel { AudioContentOrderListViewModel(get()) } viewModel { AudioContentOrderListViewModel(get()) }
viewModel { AudioContentUploadViewModel(get()) } viewModel { AudioContentUploadViewModel(get()) }

View File

@ -11,7 +11,6 @@ import coil.transform.RoundedCornersTransformation
import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse import kr.co.vividnext.sodalive.audio_content.series.GetSeriesListResponse
import kr.co.vividnext.sodalive.databinding.ItemSeriesListBigBinding import kr.co.vividnext.sodalive.databinding.ItemSeriesListBigBinding
import kr.co.vividnext.sodalive.databinding.ItemSeriesListBinding
import kr.co.vividnext.sodalive.extensions.dpToPx import kr.co.vividnext.sodalive.extensions.dpToPx
class UserProfileSeriesListAdapter( class UserProfileSeriesListAdapter(

View File

@ -4,289 +4,300 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout <androidx.core.widget.NestedScrollView
android:id="@+id/swipe_refresh_layout"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent"
android:clipToPadding="false"
android:paddingVertical="13.3dp">
<androidx.core.widget.NestedScrollView <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:clipToPadding="false" android:orientation="vertical">
android:paddingVertical="13.3dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginStart="13.3dp"
android:layout_marginBottom="26.7dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="콘텐츠 마켓"
android:textColor="@color/color_3bb9f1"
android:textSize="21.3sp" />
<LinearLayout <LinearLayout
android:id="@+id/ll_recommend_series"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="wrap_content"
android:orientation="vertical"> android:layout_marginBottom="40dp"
android:orientation="vertical"
android:visibility="gone">
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp"
android:layout_marginStart="13.3dp"
android:layout_marginBottom="26.7dp"
android:fontFamily="@font/gmarket_sans_bold" android:fontFamily="@font/gmarket_sans_bold"
android:text="콘텐츠 마켓" android:paddingHorizontal="13.3dp"
android:textColor="@color/color_3bb9f1" android:text="추천 시리즈"
android:textSize="21.3sp" /> android:textColor="@color/color_eeeeee"
android:textSize="18.3sp" />
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_new_content_creator" android:id="@+id/rv_recommend_series"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="26.7dp" android:layout_marginTop="13.3dp"
android:clipToPadding="false" android:clipToPadding="false"
android:paddingHorizontal="13.3dp" android:paddingHorizontal="13.3dp" />
android:visibility="gone" /> </LinearLayout>
<com.zhpan.bannerview.BannerViewPager <com.zhpan.bannerview.BannerViewPager
android:id="@+id/rv_banner" android:id="@+id/rv_banner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginHorizontal="13.3dp" /> android:layout_marginHorizontal="13.3dp" />
<com.zhpan.indicator.IndicatorView <com.zhpan.indicator.IndicatorView
android:id="@+id/indicator_banner" android:id="@+id/indicator_banner"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="6.7dp" android:layout_marginTop="6.7dp"
android:layout_marginBottom="26.7dp" /> android:layout_marginBottom="26.7dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
android:orientation="horizontal"
android:paddingHorizontal="13.3dp">
<LinearLayout <LinearLayout
android:id="@+id/ll_short_play"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/img_bg_short_play"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="2.7dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="숏플"
android:textColor="@color/color_dd158d"
android:textSize="16.7sp"
app:drawableStartCompat="@drawable/ic_short_play" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_review_live"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/img_bg_review_live"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="2.7dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="라이브 다시듣기"
android:textColor="@color/color_0057ff"
android:textSize="16.7sp"
app:drawableStartCompat="@drawable/ic_thumb_play_blue" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_my_stash"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
android:orientation="vertical"
android:visibility="gone">
<RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="40dp"
android:orientation="horizontal"
android:paddingHorizontal="13.3dp"> android:paddingHorizontal="13.3dp">
<LinearLayout <TextView
android:id="@+id/ll_short_play" android:layout_width="wrap_content"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:fontFamily="@font/gmarket_sans_bold"
android:background="@drawable/img_bg_short_play" android:text="내 보관함"
android:gravity="center" android:textColor="@color/color_eeeeee"
android:orientation="vertical"> android:textSize="18.3sp" />
<TextView <TextView
android:layout_width="wrap_content" android:id="@+id/tv_my_stash_view_all"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:drawablePadding="2.7dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="숏플"
android:textColor="@color/color_dd158d"
android:textSize="16.7sp"
app:drawableStartCompat="@drawable/ic_short_play" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_review_live"
android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:layout_alignParentEnd="true"
android:layout_weight="1" android:layout_centerVertical="true"
android:background="@drawable/img_bg_review_live" android:fontFamily="@font/gmarket_sans_light"
android:gravity="center" android:text="전체보기"
android:orientation="vertical"> android:textColor="@color/color_bbbbbb"
android:textSize="11.3sp" />
</RelativeLayout>
<TextView <androidx.recyclerview.widget.RecyclerView
android:layout_width="wrap_content" android:id="@+id/rv_my_stash"
android:layout_height="wrap_content"
android:drawablePadding="2.7dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="라이브 다시듣기"
android:textColor="@color/color_0057ff"
android:textSize="16.7sp"
app:drawableStartCompat="@drawable/ic_thumb_play_blue" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_my_stash"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="40dp" android:layout_marginTop="13.3dp"
android:orientation="vertical" android:clipToPadding="false"
android:visibility="gone"> android:paddingHorizontal="13.3dp" />
</LinearLayout>
<RelativeLayout <LinearLayout
android:layout_width="match_parent" android:id="@+id/ll_new_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:visibility="gone">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:paddingHorizontal="13.3dp"> android:layout_marginStart="13.3dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="새로운 콘텐츠"
android:textColor="@color/color_eeeeee"
android:textSize="18.3sp" />
<TextView <ImageView
android:layout_width="wrap_content" android:id="@+id/iv_new_content_all"
android:layout_height="wrap_content" android:layout_width="wrap_content"
android:fontFamily="@font/gmarket_sans_bold"
android:text="내 보관함"
android:textColor="@color/color_eeeeee"
android:textSize="18.3sp" />
<TextView
android:id="@+id/tv_my_stash_view_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:fontFamily="@font/gmarket_sans_light"
android:text="전체보기"
android:textColor="@color/color_bbbbbb"
android:textSize="11.3sp" />
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_my_stash"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="13.3dp" android:layout_alignParentEnd="true"
android:clipToPadding="false" android:contentDescription="@null"
android:paddingHorizontal="13.3dp" /> android:paddingHorizontal="13.3dp"
</LinearLayout> android:src="@drawable/ic_forward" />
</RelativeLayout>
<LinearLayout <androidx.recyclerview.widget.RecyclerView
android:id="@+id/ll_new_content" android:id="@+id/rv_new_content_theme"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:layout_marginTop="13.3dp"
android:visibility="gone"> android:clipToPadding="false"
android:paddingHorizontal="13.3dp" />
<RelativeLayout <androidx.recyclerview.widget.RecyclerView
android:layout_width="match_parent" android:id="@+id/rv_new_content"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13.3dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="새로운 콘텐츠"
android:textColor="@color/color_eeeeee"
android:textSize="18.3sp" />
<ImageView
android:id="@+id/iv_new_content_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:contentDescription="@null"
android:paddingHorizontal="13.3dp"
android:src="@drawable/ic_forward" />
</RelativeLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_new_content_theme"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:clipToPadding="false"
android:paddingHorizontal="13.3dp" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_new_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:clipToPadding="false"
android:paddingHorizontal="13.3dp" />
</LinearLayout>
<ProgressBar
android:id="@+id/pb_new_content"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center" />
<LinearLayout
android:id="@+id/ll_content_ranking"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="40dp" android:layout_marginTop="13.3dp"
android:clipToPadding="false"
android:paddingHorizontal="13.3dp" />
</LinearLayout>
<ProgressBar
android:id="@+id/pb_new_content"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center" />
<LinearLayout
android:id="@+id/ll_content_ranking"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="40dp"
android:orientation="vertical"
android:visibility="gone">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13.3dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="인기 콘텐츠"
android:textColor="@color/color_eeeeee"
android:textSize="18.3sp" />
<ImageView
android:id="@+id/iv_content_ranking_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:contentDescription="@null"
android:paddingHorizontal="13.3dp"
android:src="@drawable/ic_forward" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:background="@color/color_222222"
android:gravity="center"
android:orientation="vertical" android:orientation="vertical"
android:visibility="gone"> android:paddingVertical="8dp">
<RelativeLayout <TextView
android:layout_width="match_parent" android:id="@+id/tv_date"
android:layout_height="wrap_content"> android:layout_width="wrap_content"
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="13.3dp"
android:fontFamily="@font/gmarket_sans_bold"
android:text="인기 콘텐츠"
android:textColor="@color/color_eeeeee"
android:textSize="18.3sp" />
<ImageView
android:id="@+id/iv_content_ranking_all"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:contentDescription="@null"
android:paddingHorizontal="13.3dp"
android:src="@drawable/ic_forward" />
</RelativeLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="13.3dp" android:fontFamily="@font/gmarket_sans_bold"
android:background="@color/color_222222" android:textColor="@color/color_eeeeee"
android:gravity="center" android:textSize="14.7sp" />
android:orientation="vertical"
android:paddingVertical="8dp">
<TextView <TextView
android:id="@+id/tv_date" android:layout_width="wrap_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:fontFamily="@font/gmarket_sans_bold"
android:textColor="@color/color_eeeeee"
android:textSize="14.7sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:fontFamily="@font/gmarket_sans_light"
android:text="※ 인기 콘텐츠의 순위는 매주 업데이트됩니다."
android:textColor="@color/color_bbbbbb"
android:textSize="13.3sp" />
</LinearLayout>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_content_ranking_sort"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="13.3dp" android:layout_marginTop="8dp"
android:clipToPadding="false" android:fontFamily="@font/gmarket_sans_light"
android:paddingHorizontal="13.3dp" /> android:text="※ 인기 콘텐츠의 순위는 매주 업데이트됩니다."
android:textColor="@color/color_bbbbbb"
<androidx.recyclerview.widget.RecyclerView android:textSize="13.3sp" />
android:id="@+id/rv_content_ranking"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="13.3dp"
android:clipToPadding="false"
android:paddingHorizontal="6.7dp" />
</LinearLayout> </LinearLayout>
<androidx.recyclerview.widget.RecyclerView <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_curation" android:id="@+id/rv_content_ranking_sort"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:clipToPadding="false" /> android:layout_marginTop="13.3dp"
android:clipToPadding="false"
android:paddingHorizontal="13.3dp" />
<ProgressBar <androidx.recyclerview.widget.RecyclerView
android:id="@+id/pb_curation" android:id="@+id/rv_content_ranking"
android:layout_width="50dp" android:layout_width="match_parent"
android:layout_height="50dp" android:layout_height="wrap_content"
android:layout_gravity="center" /> android:layout_marginTop="13.3dp"
android:clipToPadding="false"
android:paddingHorizontal="6.7dp" />
</LinearLayout> </LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout> <androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_curation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clipToPadding="false" />
<ProgressBar
android:id="@+id/pb_curation"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center" />
</LinearLayout>
</androidx.core.widget.NestedScrollView>
<LinearLayout <LinearLayout
android:id="@+id/ll_upload_content" android:id="@+id/ll_upload_content"