feat: 메인 홈
- 요일별 시리즈 UI 추가
This commit is contained in:
@@ -0,0 +1,6 @@
|
|||||||
|
package kr.co.vividnext.sodalive.home
|
||||||
|
|
||||||
|
data class DayOfWeek(
|
||||||
|
val dayOfWeekStr: String,
|
||||||
|
val dayOfWeek: SeriesPublishedDaysOfWeek
|
||||||
|
)
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
package kr.co.vividnext.sodalive.home
|
||||||
|
|
||||||
|
import android.annotation.SuppressLint
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import androidx.recyclerview.widget.RecyclerView
|
||||||
|
import kr.co.vividnext.sodalive.databinding.ItemDayOfWeekBinding
|
||||||
|
import java.util.Calendar
|
||||||
|
|
||||||
|
class DayOfWeekAdapter(
|
||||||
|
private val screenWidth: Int,
|
||||||
|
private val onClickItem: (SeriesPublishedDaysOfWeek) -> Unit,
|
||||||
|
) : RecyclerView.Adapter<DayOfWeekAdapter.ViewHolder>() {
|
||||||
|
|
||||||
|
inner class ViewHolder(
|
||||||
|
private val binding: ItemDayOfWeekBinding
|
||||||
|
) : RecyclerView.ViewHolder(binding.root) {
|
||||||
|
@SuppressLint("NotifyDataSetChanged")
|
||||||
|
fun bind(dayOfWeek: DayOfWeek) {
|
||||||
|
binding.tvDayOfWeek.text = dayOfWeek.dayOfWeekStr
|
||||||
|
binding.tvDayOfWeek.isSelected = dayOfWeek.dayOfWeek == selectedDayOfWeek
|
||||||
|
|
||||||
|
val lp = binding.tvDayOfWeek.layoutParams
|
||||||
|
lp.height = screenWidth * 38 / 400
|
||||||
|
|
||||||
|
if (dayOfWeek.dayOfWeek == SeriesPublishedDaysOfWeek.RANDOM) {
|
||||||
|
lp.width = screenWidth * 54 / 400
|
||||||
|
} else {
|
||||||
|
lp.width = screenWidth * 38 / 400
|
||||||
|
}
|
||||||
|
|
||||||
|
binding.tvDayOfWeek.layoutParams = lp
|
||||||
|
|
||||||
|
binding.root.setOnClickListener {
|
||||||
|
onClickItem(dayOfWeek.dayOfWeek)
|
||||||
|
selectedDayOfWeek = dayOfWeek.dayOfWeek
|
||||||
|
notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var selectedDayOfWeek = SeriesPublishedDaysOfWeek.RANDOM
|
||||||
|
|
||||||
|
private val dayOfWeekItems = listOf(
|
||||||
|
DayOfWeek(dayOfWeekStr = "월", dayOfWeek = SeriesPublishedDaysOfWeek.MON),
|
||||||
|
DayOfWeek(dayOfWeekStr = "화", dayOfWeek = SeriesPublishedDaysOfWeek.TUE),
|
||||||
|
DayOfWeek(dayOfWeekStr = "수", dayOfWeek = SeriesPublishedDaysOfWeek.WED),
|
||||||
|
DayOfWeek(dayOfWeekStr = "목", dayOfWeek = SeriesPublishedDaysOfWeek.THU),
|
||||||
|
DayOfWeek(dayOfWeekStr = "금", dayOfWeek = SeriesPublishedDaysOfWeek.FRI),
|
||||||
|
DayOfWeek(dayOfWeekStr = "토", dayOfWeek = SeriesPublishedDaysOfWeek.SAT),
|
||||||
|
DayOfWeek(dayOfWeekStr = "일", dayOfWeek = SeriesPublishedDaysOfWeek.SUN),
|
||||||
|
DayOfWeek(dayOfWeekStr = "랜덤", dayOfWeek = SeriesPublishedDaysOfWeek.RANDOM),
|
||||||
|
)
|
||||||
|
|
||||||
|
// 요일 숫자에 맞춰 배열
|
||||||
|
private val dayOfWeeks = listOf(
|
||||||
|
SeriesPublishedDaysOfWeek.RANDOM,
|
||||||
|
SeriesPublishedDaysOfWeek.SUN,
|
||||||
|
SeriesPublishedDaysOfWeek.MON,
|
||||||
|
SeriesPublishedDaysOfWeek.TUE,
|
||||||
|
SeriesPublishedDaysOfWeek.WED,
|
||||||
|
SeriesPublishedDaysOfWeek.THU,
|
||||||
|
SeriesPublishedDaysOfWeek.FRI,
|
||||||
|
SeriesPublishedDaysOfWeek.SAT
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
|
||||||
|
ItemDayOfWeekBinding.inflate(
|
||||||
|
LayoutInflater.from(parent.context),
|
||||||
|
parent,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.bind(dayOfWeekItems[position])
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount() = dayOfWeekItems.count()
|
||||||
|
|
||||||
|
init {
|
||||||
|
val calendar = Calendar.getInstance()
|
||||||
|
val dayIndex = calendar.get(Calendar.DAY_OF_WEEK)
|
||||||
|
selectedDayOfWeek = dayOfWeeks[dayIndex]
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -69,8 +69,8 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
private lateinit var homeContentAdapter: HomeContentAdapter
|
private lateinit var homeContentAdapter: HomeContentAdapter
|
||||||
private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
|
private lateinit var contentBannerAdapter: AudioContentMainBannerAdapter
|
||||||
private lateinit var originalSeriesAdapter: HomeSeriesAdapter
|
private lateinit var originalSeriesAdapter: HomeSeriesAdapter
|
||||||
|
|
||||||
private lateinit var auditionAdapter: AuditionBannerAdapter
|
private lateinit var auditionAdapter: AuditionBannerAdapter
|
||||||
|
private lateinit var seriesDayOfWeekAdapter: HomeSeriesAdapter
|
||||||
|
|
||||||
private val handler = Handler(Looper.getMainLooper())
|
private val handler = Handler(Looper.getMainLooper())
|
||||||
|
|
||||||
@@ -162,6 +162,7 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
setupContentBanner()
|
setupContentBanner()
|
||||||
setupOriginalSeries()
|
setupOriginalSeries()
|
||||||
setupAudition()
|
setupAudition()
|
||||||
|
setupSeriesDayOfWeek()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun setupLiveView() {
|
private fun setupLiveView() {
|
||||||
@@ -656,6 +657,117 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>(FragmentHomeBinding::infl
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setupSeriesDayOfWeek() {
|
||||||
|
val spSectionTitle = SpannableString(binding.tvSeriesDayOfWeek.text)
|
||||||
|
spSectionTitle.setSpan(
|
||||||
|
ForegroundColorSpan(
|
||||||
|
ContextCompat.getColor(
|
||||||
|
requireContext(),
|
||||||
|
R.color.color_3bb9f1
|
||||||
|
)
|
||||||
|
),
|
||||||
|
0,
|
||||||
|
3,
|
||||||
|
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
|
||||||
|
)
|
||||||
|
binding.tvSeriesDayOfWeek.text = spSectionTitle
|
||||||
|
|
||||||
|
seriesDayOfWeekAdapter = HomeSeriesAdapter {
|
||||||
|
startActivity(
|
||||||
|
Intent(requireContext(), SeriesDetailActivity::class.java).apply {
|
||||||
|
putExtra(Constants.EXTRA_SERIES_ID, it)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
val recyclerView = binding.rvSeriesDayOfWeek
|
||||||
|
recyclerView.layoutManager = LinearLayoutManager(
|
||||||
|
context,
|
||||||
|
LinearLayoutManager.HORIZONTAL,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
|
||||||
|
recyclerView.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.left = 0
|
||||||
|
outRect.right = 8f.dpToPx().toInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
seriesDayOfWeekAdapter.itemCount - 1 -> {
|
||||||
|
outRect.left = 8f.dpToPx().toInt()
|
||||||
|
outRect.right = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
outRect.left = 8f.dpToPx().toInt()
|
||||||
|
outRect.right = 8f.dpToPx().toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
recyclerView.adapter = seriesDayOfWeekAdapter
|
||||||
|
|
||||||
|
viewModel.dayOfWeekSeriesListLiveData.observe(viewLifecycleOwner) {
|
||||||
|
if (it.isNotEmpty()) {
|
||||||
|
seriesDayOfWeekAdapter.clear()
|
||||||
|
seriesDayOfWeekAdapter.addItems(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val dayOfWeekAdapter = DayOfWeekAdapter(screenWidth = screenWidth) {
|
||||||
|
viewModel.getDayOfWeekSeriesList(it)
|
||||||
|
}
|
||||||
|
|
||||||
|
val rvDayOfWeek = binding.rvSeriesDayOfWeekDay
|
||||||
|
val layoutManager = object : LinearLayoutManager(
|
||||||
|
context,
|
||||||
|
HORIZONTAL,
|
||||||
|
false
|
||||||
|
) {
|
||||||
|
override fun canScrollVertically() = false
|
||||||
|
override fun canScrollHorizontally() = false
|
||||||
|
}
|
||||||
|
rvDayOfWeek.layoutManager = layoutManager
|
||||||
|
|
||||||
|
rvDayOfWeek.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.left = 0
|
||||||
|
outRect.right = 2.5f.dpToPx().toInt()
|
||||||
|
}
|
||||||
|
|
||||||
|
seriesDayOfWeekAdapter.itemCount - 1 -> {
|
||||||
|
outRect.left = 2.5f.dpToPx().toInt()
|
||||||
|
outRect.right = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {
|
||||||
|
outRect.left = 2.5f.dpToPx().toInt()
|
||||||
|
outRect.right = 2.5f.dpToPx().toInt()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
rvDayOfWeek.adapter = dayOfWeekAdapter
|
||||||
|
}
|
||||||
|
|
||||||
private fun bindData() {
|
private fun bindData() {
|
||||||
viewModel.isLoading.observe(viewLifecycleOwner) {
|
viewModel.isLoading.observe(viewLifecycleOwner) {
|
||||||
if (it) {
|
if (it) {
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ class HomeSeriesAdapter(
|
|||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isVisibleRecyclerView(): Boolean {
|
fun clear() {
|
||||||
return items.isNotEmpty()
|
this.items.clear()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,6 +162,9 @@ class HomeViewModel(private val repository: HomeRepository) : BaseViewModel() {
|
|||||||
.subscribe(
|
.subscribe(
|
||||||
{
|
{
|
||||||
_isLoading.value = false
|
_isLoading.value = false
|
||||||
|
if (it.success && it.data != null) {
|
||||||
|
_dayOfWeekSeriesListLiveData.value = it.data!!
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
_isLoading.value = false
|
_isLoading.value = false
|
||||||
|
|||||||
12
app/src/main/res/drawable/bg_selectable_day_of_week.xml
Normal file
12
app/src/main/res/drawable/bg_selectable_day_of_week.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<!-- 선택된 경우: 4dp 테두리 -->
|
||||||
|
<item android:state_selected="true" android:drawable="@drawable/gradient_overlay_day_of_week" />
|
||||||
|
|
||||||
|
<item>
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="#263238" />
|
||||||
|
<corners android:radius="16dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
</selector>
|
||||||
28
app/src/main/res/drawable/gradient_overlay_day_of_week.xml
Normal file
28
app/src/main/res/drawable/gradient_overlay_day_of_week.xml
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<!-- 테두리 역할: Gradient 사각형 -->
|
||||||
|
<item>
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<gradient
|
||||||
|
android:type="linear"
|
||||||
|
android:angle="270"
|
||||||
|
android:startColor="@color/color_80d8ff"
|
||||||
|
android:endColor="#6D5ED7" />
|
||||||
|
<corners android:radius="16dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
<!-- 내용 배경: 내부에 살짝 inset된 검정 배경 -->
|
||||||
|
<item
|
||||||
|
android:left="4dp"
|
||||||
|
android:top="4dp"
|
||||||
|
android:right="4dp"
|
||||||
|
android:bottom="4dp">
|
||||||
|
<shape android:shape="rectangle">
|
||||||
|
<solid android:color="#263238" />
|
||||||
|
<corners android:radius="12dp" />
|
||||||
|
</shape>
|
||||||
|
</item>
|
||||||
|
|
||||||
|
</layer-list>
|
||||||
@@ -240,8 +240,7 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_marginTop="48dp"
|
android:layout_marginTop="48dp"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical">
|
||||||
android:visibility="gone">
|
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/tv_series_day_of_week"
|
android:id="@+id/tv_series_day_of_week"
|
||||||
@@ -257,6 +256,7 @@
|
|||||||
android:id="@+id/rv_series_day_of_week_day"
|
android:id="@+id/rv_series_day_of_week_day"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:nestedScrollingEnabled="false"
|
||||||
android:layout_marginTop="16dp"
|
android:layout_marginTop="16dp"
|
||||||
android:clipToPadding="false"
|
android:clipToPadding="false"
|
||||||
android:paddingHorizontal="24dp" />
|
android:paddingHorizontal="24dp" />
|
||||||
|
|||||||
19
app/src/main/res/layout/item_day_of_week.xml
Normal file
19
app/src/main/res/layout/item_day_of_week.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/tv_day_of_week"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:background="@drawable/bg_selectable_day_of_week"
|
||||||
|
android:fontFamily="@font/pretendard_regular"
|
||||||
|
android:gravity="center"
|
||||||
|
android:textColor="@color/white"
|
||||||
|
android:textSize="18sp"
|
||||||
|
tools:text="월" />
|
||||||
|
</LinearLayout>
|
||||||
Reference in New Issue
Block a user