이번 시간에는 인터페이스로 클릭 이벤트를 구현한 부분을 인터페이스 없이
구현해보도록 하겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.06.09 - [분류 전체보기] - [안드로이드 코틀린] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상 지정 및 날짜 클릭 이벤트
- 설명 -
1. ArrayList<LocalDate?>
String에서 LocalDate로 변경
? 는 null값 가능하게함
2. if (day == null)
넘어온 값이 null이면 빈 값
else {
//해당 일자를 넣는다.
holder.dayText.text = day.dayOfMonth.toString()
}
null이 아니면 값이 있으니 날짜를 가져온다.
3. var iYear = day?.year
var iMonth = day?.monthValue
var iDay = day?.dayOfMonth
day(LocalDate)에서 년, 월, 일을 변수에 담는다.
class CalendarAdapter(private val dayList: ArrayList<LocalDate?>):
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) {
//날짜 변수에 담기
var day = dayList[holder.adapterPosition]
if(day == null){
holder.dayText.text = ""
}else{
//해당 일자를 넣는다.
holder.dayText.text = day.dayOfMonth.toString()
}
//텍스트 색상 지정(토,일)
if((position +1) % 7 == 0){ //토요일은 파랑
holder.dayText.setTextColor(Color.BLUE)
}else if( position == 0 || position % 7 == 0){ //일요일은 빨강
holder.dayText.setTextColor(Color.RED)
}
//날짜 클릭 이벤트
holder.itemView.setOnClickListener {
//인터페이스를 통해 날짜를 넘겨준다.
var iYear = day?.year
var iMonth = day?.monthValue
var iDay = day?.dayOfMonth
var yearMonDay = "$iYear 년 $iMonth 월 $iDay 일"
Toast.makeText(holder.itemView.context, yearMonDay, Toast.LENGTH_SHORT).show()
}
}
override fun getItemCount(): Int {
return dayList.size
}
}
- 설명 -
1. 인터페이스 구현하기 위해 선언한 인터페이스 제거
2. val adapter = CalendarAdapter(dayList)
어댑터 생성자에서 this 삭제
3. dayInMonthArray(date: LocalDate): ArrayList <LocalDate?>
String -> LocalDate 변경
4. var dayList = ArrayList <LocalDate?>()
String -> LocalDate 변경
5. dayList.add(null)
null 추가
6. dayList.add(LocalDate.of(selectedDate.year,
selectedDate.monthValue, i - dayOfWeek))
LocalDate.of(년, 월, 일) 추가
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<LocalDate?>{
var dayList = ArrayList<LocalDate?>()
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(null)
}else{
//LocalDate.of(년, 월, 일)
dayList.add(LocalDate.of(selectedDate.year,
selectedDate.monthValue, i - dayOfWeek))
}
}
return dayList
}
}
2022.01.16 - [안드로이드] - [안드로이드] 큐알코드(QR CODE) 스캔하는 방법
2021.06.28 - [안드로이드] - [안드로이드] 정해진 시간에 알람 울리는 방법 Notification TimePicker
2021.01.19 - [안드로이드] - [안드로이드] DrawerLayout Navigaion 쉽게 만들어보기
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part7 달력 표시 변경하기 (0) | 2022.06.12 |
---|---|
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기 (0) | 2022.06.11 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트 (0) | 2022.06.09 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part3 날짜 구현 (0) | 2022.06.08 |
[안드로이드 코틀린] 커스텀 달력 만드는 방법 part2 이번 달, 저번 달, 다음 달 구현 (0) | 2022.06.07 |
댓글 영역