이번 시간에는 토요일, 일요일 날짜에 색상을
줘서 주말이라는 느낌을 주는 것과 날짜를
클릭하면 해당 날짜를 메시지로 보여주는 기능을
구현해보겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.04.21 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part3 날짜 구현
- 설명 -
선언만 하고 기능은 메인코드에서 구현합니다.
public interface OnItemListener {
void onItemClick(String dayText);
}
2021.12.31 - [안드로이드] - [안드로이드 스튜디오] 자바 클래스 생성하는 방법
1. 인터페이스 선언
OnItemListener onItemListener;
2. 생성자 수정
public CalendarAdapter(ArrayList<String> dayList, OnItemListener onItemListener) {
this.dayList = dayList;
this.onItemListener = onItemListener;
}
3. onBindViewHolder 메서드 수정
- 토요일, 일요일 텍스트 색상 지정
- 날짜 클릭 이벤트 추가
@Override
public void onBindViewHolder(@NonNull CalendarViewHolder holder, int position) {
//날짜 변수에 담기
String day = dayList.get(position);
holder.dayText.setText(day);
//텍스트 색상 지정
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) {
//인터페이스를 통해 날짜를 넘겨준다.
onItemListener.onItemClick(day);
}
});
}
4. 전체 코드
public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.CalendarViewHolder>{
ArrayList<String> dayList;
OnItemListener onItemListener;
public CalendarAdapter(ArrayList<String> dayList, OnItemListener onItemListener) {
this.dayList = dayList;
this.onItemListener = onItemListener;
}
@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) {
//날짜 변수에 담기
String day = dayList.get(position);
holder.dayText.setText(day);
//텍스트 색상 지정
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) {
//인터페이스를 통해 날짜를 넘겨준다.
onItemListener.onItemClick(day);
}
});
}
@Override
public int getItemCount() {
return dayList.size();
}
class CalendarViewHolder extends RecyclerView.ViewHolder{
TextView dayText;
public CalendarViewHolder(@NonNull View itemView) {
super(itemView);
dayText = itemView.findViewById(R.id.dayText);
}
}
}
1. OnItemListener 구현
public class MainActivity extends AppCompatActivity implements OnItemListener{
2. 날짜 타입 설정 메서드 추가
//날짜 타입 설정(2020년 4월)
private String yearMonthFromDate(LocalDate date){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월");
return date.format(formatter);
}
3. 어뎁터 초기화 수정
- 기존에는 dayList만 전달
CalendarAdapter adapter = new CalendarAdapter(dayList, MainActivity.this);
4. 인터페이스 onItemClick메서드 구현
@Override
public void onItemClick(String dayText) {
String yearMonDay = yearMonthFromDate(selectedDate) + " " + dayText + "일";
Toast.makeText(this, yearMonDay, Toast.LENGTH_SHORT).show();
}
5. 전체 코드
public class MainActivity extends AppCompatActivity implements OnItemListener{
TextView monthYearText; //년월 텍스트뷰
LocalDate selectedDate; //년월 변수
RecyclerView recyclerView;
@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);
//현재 날짜
selectedDate = LocalDate.now();
//화면 설정
setMonthView();
//이전 달 버튼 이벤트
preBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//-1한 월을 넣어준다. (2월 -> 1월)
selectedDate = selectedDate.minusMonths(1);
setMonthView();
}
});
//다음 달 버튼 이벤트
nextBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//+1한 월을 넣어준다.(2월 -> 3월)
selectedDate = selectedDate.plusMonths(1);
setMonthView();
}
});
}//onCreate
//날짜 타입 설정(4월 2020)
private String monthYearFromDate(LocalDate date){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM월 yyyy");
return date.format(formatter);
}
//날짜 타입 설정(2020년 4월)
private String yearMonthFromDate(LocalDate date){
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy년 MM월");
return date.format(formatter);
}
//화면 설정
private void setMonthView(){
//년월 텍스트뷰 셋팅
monthYearText.setText(monthYearFromDate(selectedDate));
//해당 월 날짜 가져오기
ArrayList<String> dayList = daysInMonthArray(selectedDate);
//어뎁터 데이터 적용
CalendarAdapter adapter = new CalendarAdapter(dayList, MainActivity.this);
//레이아웃 설정(열 7개)
RecyclerView.LayoutManager manager = new GridLayoutManager(getApplicationContext(), 7);
//레이아웃 적용
recyclerView.setLayoutManager(manager);
//어뎁터 적용
recyclerView.setAdapter(adapter);
}
//날짜 생성
private ArrayList<String> daysInMonthArray(LocalDate date){
ArrayList<String> dayList = new ArrayList<>();
YearMonth yearMonth = YearMonth.from(date);
//해당 월 마지막 날짜 가져오기(예 28, 30, 31)
int lastDay = yearMonth.lengthOfMonth();
//해당 월의 첫 번째 날 가져오기(예 4월1일)
LocalDate firstDay = selectedDate.withDayOfMonth(1);
//첫 번째 날 요일 가져오기(월:1 , 일:7)
int dayOfWeek = firstDay.getDayOfWeek().getValue();
//날짜 생성
for(int i = 1; i < 42; i++){
if( i <= dayOfWeek || i > lastDay + dayOfWeek){
dayList.add("");
}else{
dayList.add(String.valueOf(i - dayOfWeek));
}
}
return dayList;
}
/**
* 날짜 어뎁터에서 넘긴 데이터를 받는 메서드
* @param dayText 날짜
*/
@Override
public void onItemClick(String dayText) {
String yearMonDay = yearMonthFromDate(selectedDate) + " " + dayText + "일";
Toast.makeText(this, yearMonDay, Toast.LENGTH_SHORT).show();
}
}//MainActivity
2022.04.18 - [안드로이드] - [안드로이드] 기본 카메라 사진 찍고 이미지 뷰에 보여주는 방법(StartActivityForResult deprecated 해결방법)
[안드로이드] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기 (0) | 2022.04.24 |
---|---|
[안드로이드] 커스텀 달력 만드는 방법 part5 인터페이스 없이 클릭 이벤트 만들기 (0) | 2022.04.23 |
[안드로이드] 커스텀 달력 만드는 방법 part3 날짜 구현 (3) | 2022.04.21 |
[안드로이드] 커스텀 달력 만드는 방법 part2 이번 달, 저번 달, 다음 달 구현 (6) | 2022.04.20 |
[안드로이드] 커스텀 달력 만드는 방법 part1 화면 구성 (0) | 2022.04.19 |
댓글 영역