이번 시간에는 이번 달(4월) 안에 이전 달(3월)과 다음 달(5월)도 같이
나오게 하는 방법을 알아보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.04.24 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기
1. Calendar 추가
Calendar calendar;
2. Calendar 초기화
//달력 초기화(오늘 날짜)
calendar = Calendar.getInstance();
3. daysInMonthArray 수정
LocalDate -> Date로 타입 변경
이전 달과 다음 달도 리스트에 등록
private ArrayList<Date> daysInMonthArray(){
ArrayList<Date> dayList = new ArrayList<>();
//날짜 복사해서 변수 생성
Calendar monthCalendar = (Calendar) calendar.clone();
//1일로 셋팅 (4월 1일)
monthCalendar.set(Calendar.DAY_OF_MONTH, 1);
//요일 가져와서 -1 일요일:1, 월요일:2
int firstDayOfMonth = monthCalendar.get(Calendar.DAY_OF_WEEK) -1;
//날짜 셋팅 (-5일전)
monthCalendar.add(Calendar.DAY_OF_MONTH, -firstDayOfMonth);
//42전까지 반복
while(dayList.size() < 42){
//리스트에 날짜 등록
dayList.add(monthCalendar.getTime());
//1일씩 늘린 날짜로 변경 1일 -> 2일 -> 3일
monthCalendar.add(Calendar.DAY_OF_MONTH, 1);
}
return dayList;
}
4. 이전 달 버튼 이벤트 수정
달 -1 기능 구현
calendar.add(Calendar.MONTH, -1);// -1
5. 다음 달 버튼 이벤트 수정
달 +1 기능 구현
calendar.add(Calendar.MONTH, 1); //+1
6. 전체 코드
public class MainActivity extends AppCompatActivity{
TextView monthYearText; //년월 텍스트뷰
RecyclerView recyclerView;
Calendar calendar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//초기화
monthYearText = findViewById(R.id.monthYearText);
ImageButton preBtn = findViewById(R.id.pre_btn);
ImageButton nextBtn = findViewById(R.id.next_btn);
recyclerView = findViewById(R.id.recyclerView);
//현재 날짜
CalendarUtil.selectedDate = LocalDate.now();
//달력 초기화(오늘 날짜)
calendar = Calendar.getInstance();
//화면 설정
setMonthView();
//이전 달 버튼 이벤트
preBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//-1한 월을 넣어준다. (2월 -> 1월)
CalendarUtil.selectedDate = CalendarUtil.selectedDate.minusMonths(1);
calendar.add(Calendar.MONTH, -1);// -1
setMonthView();
}
});
//다음 달 버튼 이벤트
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//+1한 월을 넣어준다.(2월 -> 3월)
CalendarUtil.selectedDate = CalendarUtil.selectedDate.plusMonths(1);
calendar.add(Calendar.MONTH, 1); //+1
setMonthView();
}
});
}//onCreate
//날짜 타입 설정(4월 2020)
private String monthYearFromDate(LocalDate date){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM월 yyyy");
return date.format(formatter);
}
//화면 설정
private void setMonthView(){
//년월 텍스트뷰 셋팅
monthYearText.setText(monthYearFromDate(CalendarUtil.selectedDate));
//해당 월 날짜 가져오기
ArrayList<Date> dayList = daysInMonthArray();
//어뎁터 데이터 적용
CalendarAdapter adapter = new CalendarAdapter(dayList);
//레이아웃 설정(열 7개)
RecyclerView.LayoutManager manager = new GridLayoutManager(getApplicationContext(), 7);
//레이아웃 적용
recyclerView.setLayoutManager(manager);
//어뎁터 적용
recyclerView.setAdapter(adapter);
}
//날짜 생성
private ArrayList<Date> daysInMonthArray(LocalDate date){
ArrayList<Date> dayList = new ArrayList<>();
//날짜 복사해서 변수 생성
Calendar monthCalendar = (Calendar) calendar.clone();
//1일로 셋팅 (4월 1일)
monthCalendar.set(Calendar.DAY_OF_MONTH, 1);
//요일 가져와서 -1 일요일:1, 월요일:2
int firstDayOfMonth = monthCalendar.get(Calendar.DAY_OF_WEEK) -1;
//날짜 셋팅 (-5일전)
monthCalendar.add(Calendar.DAY_OF_MONTH, -firstDayOfMonth);
//42전까지 반복
while(dayList.size() < 42){
//리스트에 날짜 등록
dayList.add(monthCalendar.getTime());
//1일씩 늘린 날짜로 변경 1일 -> 2일 -> 3일
monthCalendar.add(Calendar.DAY_OF_MONTH, 1);
}
return dayList;
}
}//MainActivity
1. 리스트 수정 및 생성자 수정
LocalDate -> Date 타입으로 변경되었습니다.
ArrayList<Date> dayList;
public CalendarAdapter(ArrayList<Date> dayList) {
this.dayList = dayList;
}
2. onBindViewHolder 수정
LocalDate -> Date 타입으로 변경되었습니다.
@Override
public void onBindViewHolder(@NonNull CalendarViewHolder holder, int position) {
//날짜 변수에 담기
Date monthDate = dayList.get(position);
//달력 초기화
Calendar dateCalendar = Calendar.getInstance();
dateCalendar.setTime(monthDate);
//날짜 변수에 담기
int dayNo = dateCalendar.get(Calendar.DAY_OF_MONTH);
holder.dayText.setText(String.valueOf(dayNo));
//텍스트 색상 지정
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(new View.OnClickListener() {
@Override
public void onClick(View view) {
//클릭 시 기능 구현
}
});
}
3. 전체 코드
public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.CalendarViewHolder>{
ArrayList<Date> dayList;
public CalendarAdapter(ArrayList<Date> dayList) {
this.dayList = dayList;
}
@NonNull
@Override
public CalendarViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.calendar_cell, parent, false);
return new CalendarViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull CalendarViewHolder holder, int position) {
//날짜 변수에 담기
Date monthDate = dayList.get(position);
//달력 초기화
Calendar dateCalendar = Calendar.getInstance();
dateCalendar.setTime(monthDate);
//날짜 변수에 담기
int dayNo = dateCalendar.get(Calendar.DAY_OF_MONTH);
holder.dayText.setText(String.valueOf(dayNo));
//텍스트 색상 지정
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(new View.OnClickListener() {
@Override
public void onClick(View view) {
//클릭 시 기능 구현
}
});
}
@Override
public int getItemCount() {
return dayList.size();
}
class CalendarViewHolder extends RecyclerView.ViewHolder{
TextView dayText;
View parentView;
public CalendarViewHolder(@NonNull View itemView) {
super(itemView);
dayText = itemView.findViewById(R.id.dayText);
parentView = itemView.findViewById(R.id.parentView);
}
}
}
2022.04.12 - [안드로이드] - [안드로이드] 프래그먼트(Fragment)에서 액티비티(Activity) 데이터 전달하는 방법
2022.04.11 - [안드로이드] - [안드로이드] 액티비티(Activity)에서 프래그먼트(Fragment) 데이터 전달하는 방법
[안드로이드] RecycelrView 안에(중첩) RecycelrView 만드는 방법 part1 (0) | 2022.04.27 |
---|---|
[안드로이드] 커스텀 달력 만드는 방법 part8 이번 달만 색상 변경하기 (5) | 2022.04.26 |
[안드로이드] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기 (0) | 2022.04.24 |
[안드로이드] 커스텀 달력 만드는 방법 part5 인터페이스 없이 클릭 이벤트 만들기 (0) | 2022.04.23 |
[안드로이드] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트 (2) | 2022.04.22 |
댓글 영역