이번 시간에는 part4에서 클릭 이벤트 때문에
인터페이스를 만들어서 구현했습니다.
인터페이스를 쓴 이유는 메인코드에서 어뎁터에
데이터를 넘길 때 숫자만 넘겨서, 어뎁터에서는
해당 년, 월을 알 수 없으나 메인코드에서는 해당
년, 월을 알 수 있으니, 인터페이스를 통해 메인코드에서
구현하고 클릭 이벤트를 만드는 복잡한 과정을 거쳤습니다.
요약하자면
1. 어뎁터는 숫자만 알고 있다.
2. 메인코드는 년, 월, 일을 다 알고 있다.
3. 인터페이스를 통해 메인코드에서 클릭이벤트 구현을 했다.
만약에 숫자가 아니라 년, 월, 일을 한 번에 어뎁터에 던진다면
인터페이스를 만들 필요가 없어진다.
숫자만 넘기는게 아닌 년, 월, 일을 넘기는 식으로 코드를
변경해보도록 하겠습니다.
이전 포스팅은 아래 링크를 들어가시면 됩니다.
2022.04.22 - [안드로이드] - [안드로이드] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상 지정 및 날짜 클릭 이벤트
[안드로이드] 커스텀 달력 만드는 방법 part4 토요일 일요일 색상지정 및 날짜 클릭 이벤트
이번 시간에는 토요일, 일요일 날짜에 색상을 줘서 주말이라는 느낌을 주는 것과 날짜를 클릭하면 해당 날짜를 메시지로 보여주는 기능을 구현해보겠습니다. 이전 포스팅은 아래 링크를 들어가
aries574.tistory.com
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 해결방법)
[안드로이드] 기본 카메라 사진 찍고 이미지뷰에 보여주는 방법(StartActivityForResult deprecated 해결방
이번 시간에는 기본 카메라 불러서 사진 찍고 이미지 뷰에 보여주는 방법에 대하여 알아보겠습니다. 기존 startactivityforresult 말고 다른 방식으로 구현했습니다. 목차 1. 실행 화면 2. 메인 화면 구
aries574.tistory.com
2022.04.17 - [안드로이드] - [안드로이드] RelativeLayout 쉽게 사용하는 방법
[안드로이드] RelativeLayout 쉽게 사용하는 방법
이번 시간에는 RelativeLayout에 대하여 알아보겠습니다. LinearLayout이 뷰의 위치를 가로, 세로로 구성한다면 RelativeLayout은 상대방의 뷰에 따라 위치를 구성합니다. 직접 해보면 쉽게 사용할 수 있습
aries574.tistory.com
2022.04.16 - [안드로이드] - [안드로이드] LinearLayout 쉽게 사용하는 방법
[안드로이드] LinearLayout 쉽게 사용하는 방법
이번 시간에는 LinearLayout을 쉽게 사용하는 방법에 대하여 알아보겠습니다. LinearLayout은 화면의 내용들을 가로나 세로 형태로 배치해줍니다. 가로, 세로를 섞어서 사용할 수도 있습니다. 직접 만
aries574.tistory.com
[안드로이드] 커스텀 달력 만드는 방법 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 |
댓글 영역