이번 시간에는 해당 월에 따른 날짜를 보여주는 방법을 알아보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.06.07 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part2 이번 달, 저번 달, 다음 달 구현
- 설명 -
날짜를 표시하는 TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical"
android:padding="8dp">
<TextView
android:id="@+id/dayText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="1"
android:textSize="25sp"
android:textStyle="bold"/>
</LinearLayout>
- 설명 -
1. onCreateViewHolder
화면 설정
2. onBindViewHolder
데이터 설정
class CalendarAdapter(private val dayList: ArrayList<String>):
RecyclerView.Adapter<CalendarAdapter.ItemViewHolder>() {
class ItemViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){
val dayText: TextView = itemView.findViewById(R.id.dayText)
}
//화면 설정
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.calendar_item, parent, false)
return ItemViewHolder(view)
}
//데이터 설정
override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {
holder.dayText.text = dayList[holder.adapterPosition]
}
override fun getItemCount(): Int {
return dayList.size
}
}
- 설명 -
1. daysInMonthArray
날짜 생성 함수
2. val adapter = CalendarAdapter(dayList)
어댑터 초기화
3. GridLayoutManager(applicationContext, 7)
레이아웃을 격자모양으로 7개
4. binding.recyclerView.layoutManager = manager
레이아웃 적용
5. binding.recyclerView.adapter = adapter
어댑터 적용
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
//년월 변수
lateinit var selectedDate: LocalDate
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//binding 초기화
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
//현재 날짜
selectedDate = LocalDate.now()
//화면 설정
setMonthView()
//이전달 버튼 이벤트
binding.preBtn.setOnClickListener {
//현재 월 -1 변수에 담기
selectedDate = selectedDate.minusMonths(1)
setMonthView()
}
//다음달 버튼 이벤트
binding.nextBtn.setOnClickListener {
selectedDate = selectedDate.plusMonths(1)
setMonthView()
}
}
//날짜 화면에 보여주기
private fun setMonthView() {
//년월 텍스트뷰 셋팅
binding.monthYearText.text = monthYearFromDate(selectedDate)
//날짜 생성해서 리스트에 담기
val dayList = dayInMonthArray(selectedDate)
//어댑터 초기화
val adapter = CalendarAdapter(dayList)
//레이아웃 설정(열 7개)
var manager: RecyclerView.LayoutManager = GridLayoutManager(applicationContext, 7)
//레이아웃 적용
binding.recyclerView.layoutManager = manager
//어댑터 적용
binding.recyclerView.adapter = adapter
}
//날짜 타입 설정
private fun monthYearFromDate(date: LocalDate): String{
var formatter = DateTimeFormatter.ofPattern("MM월 yyyy")
// 받아온 날짜를 해당 포맷으로 변경
return date.format(formatter)
}
//날짜 생성
private fun dayInMonthArray(date: LocalDate): ArrayList<String>{
var dayList = ArrayList<String>()
var yearMonth = YearMonth.from(date)
//해당 월 마지막 날짜 가져오기(예: 28, 30, 31)
var lastDay = yearMonth.lengthOfMonth()
//해당 월의 첫 번째 날 가져오기(예: 4월 1일)
var firstDay = selectedDate.withDayOfMonth(1)
//첫 번째날 요일 가져오기(월:1, 일: 7)
var dayOfWeek = firstDay.dayOfWeek.value
for(i in 1..41){
if(i <= dayOfWeek || i > (lastDay + dayOfWeek)){
dayList.add("")
}else{
dayList.add((i - dayOfWeek).toString())
}
}
return dayList
}
}
2022.05.20 - [안드로이드] - [안드로이드 코틀린] 배열 쉽게 만드는 방법
2022.05.21 - [안드로이드] - [안드로이드 코틀린] 반복문 For 만드는 다양한 방법
2022.05.23 - [안드로이드] - [안드로이드 코틀린] 조건문 if, else if 만드는 방법
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part5 인터페이스 없이 클릭 이벤트 만들기 (0) | 2022.06.10 |
---|---|
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트 (0) | 2022.06.09 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part2 이번 달, 저번 달, 다음 달 구현 (0) | 2022.06.07 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part1 화면 구성 (0) | 2022.06.06 |
[안드로이드 코틀린] LiveData 만드는 방법 part2 - 레이아웃에 ViewModel 직접 적용 (0) | 2022.06.05 |
댓글 영역