Skip to content

Commit

Permalink
Merge pull request #133 from EAT-SSU/revert-129-100-fix-weekly-calend…
Browse files Browse the repository at this point in the history
…ar-infinite

Revert "[FIX] 캘린더 무한대로 수정"
  • Loading branch information
HI-JIN2 authored Feb 23, 2024
2 parents 0a857ab + c288932 commit 0c33677
Show file tree
Hide file tree
Showing 11 changed files with 221 additions and 283 deletions.
148 changes: 98 additions & 50 deletions app/src/main/java/com/eatssu/android/ui/main/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,19 @@ import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.viewpager2.widget.ViewPager2
import com.eatssu.android.R
import com.eatssu.android.base.BaseActivity
import com.eatssu.android.data.entity.CalendarData
import com.eatssu.android.data.service.MyPageService
import com.eatssu.android.databinding.ActivityMainBinding
import com.eatssu.android.ui.main.calendar.CalendarAdapter
import com.eatssu.android.ui.main.calendar.CalendarAdapter.OnItemListener
import com.eatssu.android.util.CalendarUtils.daysInWeekArray
import com.eatssu.android.util.CalendarUtils.monthYearFromDate
import com.eatssu.android.ui.main.calendar.CalendarViewModel
import com.eatssu.android.ui.main.calendar.OnItemClickListener
import com.eatssu.android.ui.mypage.MyPageActivity
import com.eatssu.android.ui.mypage.MypageViewModel
import com.eatssu.android.ui.mypage.MypageViewModelFactory
Expand All @@ -34,16 +29,18 @@ import com.eatssu.android.util.RetrofitImpl
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
import com.prolificinteractive.materialcalendarview.*
import java.time.LocalDate
import com.eatssu.android.util.CalendarUtils
import java.time.DayOfWeek
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.time.temporal.TemporalAdjusters
import java.util.*

class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate), OnItemListener {
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {

private lateinit var viewModel: MypageViewModel
lateinit var calendarAdapter: CalendarAdapter
private var calendarList = ArrayList<CalendarData>()

private var monthYearText: TextView? = null
private var calendarRecyclerView: RecyclerView? = null
private lateinit var viewModel: MypageViewModel

@RequiresApi(Build.VERSION_CODES.O)
@SuppressLint("SuspiciousIndentation")
Expand Down Expand Up @@ -75,58 +72,109 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
// 2. TabLayout과 ViewPager2를 연결하고, TabItem의 메뉴명을 설정한다.
TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.text = tabTitles[position] }.attach()

binding.btnSetting.setOnClickListener {
binding.mcvSetting.setOnClickListener {
val intent = Intent(this, MyPageActivity::class.java) // 인텐트를 생성해줌,
startActivity(intent) // 화면 전환을 시켜줌
}

initWidgets()
CalendarUtils.selectedDate = LocalDate.now()
setWeekView()
}
val weekDay: Array<String> = resources.getStringArray(R.array.calendar_day)

private fun initWidgets() {
calendarRecyclerView = binding.weekRecycler
monthYearText = binding.monthYearTV
}
calendarAdapter = CalendarAdapter(calendarList)

@RequiresApi(Build.VERSION_CODES.O)
private fun setWeekView() {
monthYearText?.setText(CalendarUtils.selectedDate?.let { monthYearFromDate(it) })
val days: ArrayList<LocalDate>? = CalendarUtils.selectedDate?.let { daysInWeekArray(it) }
val calendarAdapter = days?.let { CalendarAdapter(it, this) }
val viewModel = ViewModelProvider(this@MainActivity)[CalendarViewModel::class.java]

// GridLayoutManager 생성
val layoutManager: GridLayoutManager = GridLayoutManager(applicationContext, 7, LinearLayoutManager.VERTICAL, false)
calendarList.apply {
val dateFormat =
DateTimeFormatter.ofPattern("dd").withLocale(Locale.forLanguageTag("ko"))
val monthFormat = DateTimeFormatter.ofPattern("yyyy . MM . dd")
.withLocale(Locale.forLanguageTag("ko"))
val dayFormat = DateTimeFormatter.ofPattern("dd")

val todayDate = LocalDateTime.now().format(dayFormat)

viewModel.setData(todayDate)

val preSunday: LocalDateTime = LocalDateTime.now().with(
TemporalAdjusters.previousOrSame(
DayOfWeek.SUNDAY
)
)
Log.d("preSunday", preSunday.toString())
for (i in 0..6) {
Log.d("날짜만", weekDay[i])

calendarList.apply {
add(
CalendarData(
preSunday.plusDays(i.toLong()).format(dateFormat),
weekDay[i]
)
)
}
Log.d("저번 주 일요일 기준으로 시작!", preSunday.plusDays(i.toLong()).format(dateFormat))
}
binding.weekRecycler.adapter = calendarAdapter
binding.weekRecycler.layoutManager = GridLayoutManager(this@MainActivity, 7)

}

calendarRecyclerView!!.layoutManager = layoutManager
calendarRecyclerView!!.adapter = calendarAdapter
}
//RecyclerView에 목록 출력
val recyclerView = binding.weekRecycler

@RequiresApi(Build.VERSION_CODES.O)
fun previousWeekAction(view: View?) {
CalendarUtils.selectedDate = CalendarUtils.selectedDate!!.minusWeeks(1)
setWeekView()
}
val adapter = calendarAdapter

@RequiresApi(Build.VERSION_CODES.O)
fun nextWeekAction(view: View?) {
CalendarUtils.selectedDate = CalendarUtils.selectedDate!!.plusWeeks(1)
setWeekView()
}
adapter.setOnItemClickListener(object : OnItemClickListener {
override fun onItemClick(v: View?, data: CalendarData) {

@RequiresApi(Build.VERSION_CODES.O)
override fun onItemClick(position: Int, date: LocalDate?) {
val viewModel = ViewModelProvider(this@MainActivity)[CalendarViewModel::class.java]
val returnViewHolderList = calendarAdapter.returnViewHolderList()
lateinit var holderSelect: CalendarAdapter.CalendarViewHolder
lateinit var selected: String

if (date != null) {
CalendarUtils.selectedDate = date
viewModel.setData(date)
Log.d("maindate", date.toString())
}
for (holder in returnViewHolderList) {
holder.binding.weekCardview.setBackgroundResource(R.drawable.ic_selector_background_white)
holder.binding.day.isSelected = false
holder.binding.date.isSelected = false
if (holder.today == data.cl_date) {
holderSelect = holder
selected = holder.today
}
}
holderSelect.binding.day.isSelected = true
holderSelect.binding.date.isSelected = true
holderSelect.binding.weekCardview.setBackgroundResource(R.drawable.transparent_calendar_element)

viewModel.setData(selected)

// viewModel에 값 넘어가서 메뉴 뜨는지 확인하는 코드
//var senddate = "14"
//viewModel.setData(senddate)

// 1) ViewPager2 참조
val viewPager: ViewPager2 = binding.vpMain
val tabLayout: TabLayout = binding.tabLayout

// 2) FragmentStateAdapter 생성 : Fragment 여러개를 ViewPager2에 연결해주는 역할
val viewpagerFragmentAdapter = ViewPager2Adapter(this@MainActivity)

// 3) ViewPager2의 adapter에 설정
viewPager.adapter = viewpagerFragmentAdapter
viewPager.setCurrentItem(
viewpagerFragmentAdapter.getDefaultFragmentPosition(),
false
)

// ###### TabLayout과 ViewPager2를 연결
// 1. 탭메뉴의 이름을 리스트로 생성해둔다.
val tabTitles = listOf("아침", "점심", "저녁")

// 2. TabLayout과 ViewPager2를 연결하고, TabItem의 메뉴명을 설정한다.
TabLayoutMediator(tabLayout, viewPager) { tab, position -> tab.text = tabTitles[position] }.attach()


}
})

setWeekView()
recyclerView.adapter = adapter
}

private fun setupNoToolbar() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,50 +5,86 @@ import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.RequiresApi
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.RecyclerView
import com.eatssu.android.R
import com.eatssu.android.data.entity.CalendarData
import com.eatssu.android.databinding.ItemCalendarListBinding
import com.eatssu.android.util.CalendarUtils
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.*


internal class CalendarAdapter(
private val days: ArrayList<LocalDate>,
private val onItemListener: OnItemListener
) :
RecyclerView.Adapter<CalendarViewHolder>() {
class CalendarAdapter(private val cList: List<CalendarData>) :
RecyclerView.Adapter<CalendarAdapter.CalendarViewHolder>() {
private var allViewHolders : List<CalendarViewHolder> = mutableListOf()
private var mListener: OnItemClickListener? = null

inner class CalendarViewHolder(val binding: ItemCalendarListBinding) :
RecyclerView.ViewHolder(binding.root) {

lateinit var today : String
lateinit var day : String

@RequiresApi(Build.VERSION_CODES.O)
fun bind(item: CalendarData) {
binding.date.text = item.cl_date
binding.day.text = item.cl_day

today = binding.date.text as String
day = binding.day.text as String

// 오늘 날짜
val now = LocalDate.now()
.format(
DateTimeFormatter.ofPattern("dd").withLocale(Locale.forLanguageTag("ko"))
)

// 오늘 날짜와 캘린더의 오늘 날짜가 같을 경우 background_blue 적용하기
if (now.equals(today)) {
binding.date.isSelected = true
binding.day.isSelected = true
binding.weekCardview.setBackgroundResource(R.drawable.selector_background_blue)
}
else {
binding.weekCardview.setBackgroundResource(R.drawable.ic_selector_background_white)
}
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CalendarViewHolder {
val binding =
ItemCalendarListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
val inflater = LayoutInflater.from(parent.context)
val view: View = inflater.inflate(R.layout.item_calendar_list, parent, false)
val layoutParams = view.layoutParams
layoutParams.height = parent.height
return CalendarViewHolder(binding, view, onItemListener, days)
return CalendarViewHolder(binding)
}

@RequiresApi(Build.VERSION_CODES.O)
override fun onBindViewHolder(holder: CalendarViewHolder, position: Int) {
val date = days[position]
holder.dayOfMonth.text = date.dayOfMonth.toString()
holder.bind(cList[position])

if (date == CalendarUtils.selectedDate) {
holder.parentView.setBackgroundResource(R.drawable.selector_background_blue)
holder.dayOfMonth.setTextColor(ContextCompat.getColor(holder.itemView.context, R.color.selector_calendar_colortext))
}
else {
holder.parentView.setBackgroundResource(R.drawable.ic_selector_background_white)
allViewHolders = allViewHolders.plus(holder)

holder.itemView.setOnClickListener { v ->
val pos = holder.adapterPosition
if (pos != RecyclerView.NO_POSITION) {
mListener?.onItemClick(v, cList.get(position))
}
}
}

}

override fun getItemCount(): Int {
return days.size
return cList.size
}

interface OnItemListener {
fun onItemClick(position: Int, date: LocalDate?)
fun setOnItemClickListener(listener: OnItemClickListener?) {
mListener = listener
}

fun returnViewHolderList(): List<CalendarViewHolder> {
return allViewHolders
}
}

interface OnItemClickListener {
fun onItemClick(v: View?, data: CalendarData)
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@ package com.eatssu.android.ui.main.calendar
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import java.time.LocalDate

class CalendarViewModel : ViewModel() {
private val data = MutableLiveData<LocalDate>()
private val data = MutableLiveData<String>()

fun setData(dataToSend: LocalDate) {
fun setData(dataToSend: String) {
data.value = dataToSend
}

fun getData(): LiveData<LocalDate> {
fun getData(): LiveData<String> {
return data
}
}
22 changes: 18 additions & 4 deletions app/src/main/java/com/eatssu/android/ui/main/menu/MenuFragment.kt
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,27 @@ class MenuFragment : Fragment() {
// ViewModel에서 데이터 가져오기
calendarViewModel.getData().observe(viewLifecycleOwner) { dataReceived ->

val parsedDate = LocalDate.parse(dataReceived.toString(), DateTimeFormatter.ofPattern("yyyy-MM-dd"))
menuDate = parsedDate.format(DateTimeFormatter.ofPattern("yyyyMMdd"))
Log.d("menudate", menuDate)
val preSunday: LocalDateTime = LocalDateTime.now().with(
TemporalAdjusters.previousOrSame(
DayOfWeek.SUNDAY
)
)

val dateFormat =
DateTimeFormatter.ofPattern("dd").withLocale(Locale.forLanguageTag("ko"))
val fullFormat = DateTimeFormatter.ofPattern("yyyyMMdd").withLocale(Locale.forLanguageTag("ko"))

for (i in 0..6) {
if (preSunday.plusDays(i.toLong()).format(dateFormat) == dataReceived) {
menuDate = preSunday.plusDays(i.toLong()).format(fullFormat)
}
}

Log.d("menucalendar", menuDate)

// Assuming menuDate is a String in the format "yyyyMMdd"
val formattedDate =
LocalDate.parse(menuDate, DateTimeFormatter.BASIC_ISO_DATE)
LocalDate.parse(menuDate.substring(0, 8), DateTimeFormatter.BASIC_ISO_DATE)

val dayOfWeek = formattedDate.dayOfWeek

Expand Down
Loading

0 comments on commit 0c33677

Please sign in to comment.