상세 컨텐츠

본문 제목

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part3 날짜 구현

안드로이드

by aries574 2022. 6. 8. 13:53

본문


이번 시간에는 해당 월에 따른 날짜를 보여주는 방법을 알아보겠습니다.

이전 포스팅은 아래 링크를 들어가시면 됩니다.

2022.06.07 - [안드로이드] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part2 이번 달, 저번 달, 다음 달 구현

 

[안드로이드 코틀린] 커스텀 달력 만드는 방법 part2 이번 달, 저번 달, 다음 달 구현

이번 시간에는 첫 번째 레이아웃의 텍스트뷰에 현재 월을 보여주고, 왼쪽 이미지 버튼을 누르면 이전달이, 오른쪽 이미지 버튼을 누르면 다음 달이 보이게 기능을 구현해보겠습니다. 이전 포스

aries574.tistory.com


목차

1. 실행 화면
2. 날짜 화면 만들기 calendar_cell.xml
3. 날짜 어댑터 만들기 CalendarAdapter.kt
4. 메인 코드 수정 MainActivity.kt


1. 실행 화면


2. 날짜 화면 만들기 calendar_cell.xml

 - 설명 - 

 날짜를 표시하는 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>

 


3. 날짜 어댑터 만들기 CalendarAdapter.kt

 - 설명 - 

 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
    }
}

4. 메인 코드 수정 MainActivity.kt

 - 설명 -

 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 - [안드로이드] - [안드로이드 코틀린] 배열 쉽게 만드는 방법

 

[안드로이드 코틀린] 배열 쉽게 만드는 방법

 이번 시간에는 코틀린에서 배열 만드는 방법에 대하여 알아보겠습니다. ​목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.java 1. 실행 화면 2. 메인 ..

aries574.tistory.com

2022.05.21 - [안드로이드] - [안드로이드 코틀린] 반복문 For 만드는 다양한 방법

 

[안드로이드 코틀린] 반복문 For 만드는 다양한 방법

 이번 시간에는 코틀린에서 반복문으로 쓰이는 For문을 다양하게 만드는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.jav

aries574.tistory.com

2022.05.23 - [안드로이드] - [안드로이드 코틀린] 조건문 if, else if 만드는 방법

 

[안드로이드 코틀린] 조건문 if, else if 만드는 방법

이번 시간에는 조건문에 쓰이는 if문 만드는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 구성 activity_main.xml 3. 메인 코드 구현 MainActivity.java1. 실행 화면 2. 메인 ..

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역