이번 시간에는 part4에서 클릭 이벤트 때문에
인터페이스를 만들어서 구현했습니다.
인터페이스를 쓴 이유는 메인코드에서 어뎁터에
데이터를 넘길 때 숫자만 넘겨서, 어뎁터에서는
해당 년, 월을 알 수 없으나 메인코드에서는 해당
년, 월을 알 수 있으니, 인터페이스를 통해 메인코드에서
구현하고 클릭 이벤트를 만드는 복잡한 과정을 거쳤습니다.
요약하자면
1. 어뎁터는 숫자만 알고 있다.
2. 메인코드는 년, 월, 일을 다 알고 있다.
3. 인터페이스를 통해 메인코드에서 클릭이벤트 구현을 했다.
만약에 숫자가 아니라 년, 월, 일을 한 번에 어뎁터에 던진다면
인터페이스를 만들 필요가 없어진다.
숫자만 넘기는게 아닌 년, 월, 일을 넘기는 식으로 코드를
변경해보도록 하겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.04.22 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상 지정 및 날짜 클릭 이벤트
1. 리스트 수정
기존 String -> LocalDate로 타입 변경
ArrayList<LocalDate> dayList;
2. 생성자 수정
public CalendarAdapter(ArrayList<LocalDate> dayList) {
this.dayList = dayList;
}
3. onBindViewHolder 수정
if문을 통해 null이면 빈 값을, 값이 있다면 날짜를 입력
클릭이벤트에 인터페이스 대신 직접 메시지 기능 구현
@Override
public void onBindViewHolder(@NonNull CalendarViewHolder holder, int position) {
//날짜 변수에 담기
LocalDate day = dayList.get(position);
if(day == null){
holder.dayText.setText("");
}else{
//해당 일자를 넣는다.
holder.dayText.setText(String.valueOf(day.getDayOfMonth()));
}
//텍스트 색상 지정
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) {
int iYear = day.getYear(); //년
int iMonth = day.getMonthValue();//월
int iDay = day.getDayOfMonth();//일
String yearMonDay = iYear + "년 " +iMonth + "월 " + iDay + "일";
Toast.makeText(holder.itemView.getContext() , yearMonDay , Toast.LENGTH_SHORT).show();
}
});
}
4. 전체 코드
public class CalendarAdapter extends RecyclerView.Adapter<CalendarAdapter.CalendarViewHolder>{
ArrayList<LocalDate> dayList;
public CalendarAdapter(ArrayList<LocalDate> 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) {
//날짜 변수에 담기
LocalDate day = dayList.get(position);
if(day == null){
holder.dayText.setText("");
}else{
//해당 일자를 넣는다.
holder.dayText.setText(String.valueOf(day.getDayOfMonth()));
}
//텍스트 색상 지정
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) {
int iYear = day.getYear(); //년
int iMonth = day.getMonthValue();//월
int iDay = day.getDayOfMonth();//일
String yearMonDay = iYear + "년 " +iMonth + "월 " + iDay + "일";
Toast.makeText(holder.itemView.getContext() , yearMonDay , Toast.LENGTH_SHORT).show();
}
});
}
@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. daysInMonthArray 수정
기존 String -> LocalDate로 변경
private ArrayList<LocalDate> daysInMonthArray(LocalDate date){
ArrayList<LocalDate> 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(null);
}else{
// dayList.add(String.valueOf(i - dayOfWeek));
dayList.add(LocalDate.of(selectedDate.getYear(), selectedDate.getMonth(), i - dayOfWeek));
}
}
return dayList;
}
2. setMonthView 수정
String -> LocalDate로 변경
ArrayList<LocalDate> dayList = daysInMonthArray(selectedDate);
어뎁터 초기화에 list만 적용
CalendarAdapter adapter = new CalendarAdapter(dayList);
3. 전체 코드
public class MainActivity extends AppCompatActivity{
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);
}
//화면 설정
private void setMonthView(){
//년월 텍스트뷰 셋팅
monthYearText.setText(monthYearFromDate(selectedDate));
//해당 월 날짜 가져오기
ArrayList<LocalDate> dayList = daysInMonthArray(selectedDate);
//어뎁터 데이터 적용
CalendarAdapter adapter = new CalendarAdapter(dayList);
//레이아웃 설정(열 7개)
RecyclerView.LayoutManager manager = new GridLayoutManager(getApplicationContext(), 7);
//레이아웃 적용
recyclerView.setLayoutManager(manager);
//어뎁터 적용
recyclerView.setAdapter(adapter);
}
//날짜 생성
private ArrayList<LocalDate> daysInMonthArray(LocalDate date){
ArrayList<LocalDate> 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(null);
}else{
dayList.add(LocalDate.of(selectedDate.getYear(), selectedDate.getMonth(), i - dayOfWeek));
}
}
return dayList;
}
}//MainActivity
2022.04.18 - [안드로이드] - [안드로이드] 기본 카메라 사진 찍고 이미지뷰에 보여주는 방법(StartActivityForResult deprecated 해결방법)
[안드로이드] 커스텀 달력 만드는 방법 part7 달력 표시 변경하기 (1) | 2022.04.25 |
---|---|
[안드로이드] 커스텀 달력 만드는 방법 part6 오늘 날짜 색상 변경하기 (0) | 2022.04.24 |
[안드로이드] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트 (2) | 2022.04.22 |
[안드로이드] 커스텀 달력 만드는 방법 part3 날짜 구현 (3) | 2022.04.21 |
[안드로이드] 커스텀 달력 만드는 방법 part2 이번 달, 저번 달, 다음 달 구현 (6) | 2022.04.20 |
댓글 영역