카테고리 없음
GridView 달력만들기
장꾸꾸
2020. 10. 5. 16:35
POINT
* 커스텀리스트뷰처럼 그리드뷰에서 어댑터사용하기
* 저번달의 날(회색)/토요일(파란색)/일요일(빨간색)으로 color 설정하기 _ 나머지 % 이용
* 그리드뷰에는 String이 기본값이므로 형변환 필수다.
* itemArr에 넣어준다 /gridview의 데이터가 눈에 보임. 한줄에 다섯칸이 아니라 달력이니까 한줄에 7칸. 7로 바꿈.
// 달력만들어주기 위한 메소드 setCal
private void setCal() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
int yoil = cal.get(Calendar.DAY_OF_WEEK); // 7
int dis = yoil - 1; // 6
cal.add(Calendar.MONTH, -1);
int max = cal.getActualMaximum(Calendar.DATE);
preCount = dis;
for (int i = 0; i < dis; i++) {
itemArr.add(0, new ItemData(String.valueOf(max))); // itemArr에 넣어준다. (형변환해서 String.valueOf로)
max--;
}
cal.add(Calendar.MONTH, 1);
max = cal.getActualMaximum(Calendar.DATE);
for (int i = 0; i < max; i++) {
itemArr.add(new ItemData(String.valueOf(i + 1)));
}
cal.set(Calendar.DATE, max);
yoil = cal.get(Calendar.DAY_OF_WEEK);
dis = 7 - yoil;
for (int i = 0; i < dis; i++) {
itemArr.add(new ItemData(String.valueOf(i + 1)));
}
adapter.notifyDataSetChanged(); // 데이터 change 반영해서 화면 변화
}
* 나머지 % 이용해서 색 바꾸기 (저번달 -> 회색/ 일요일 -> 빨강/ 토요일 -> 파랑)
int preCount = 0; // 저번달 날짜는 회색! dis값을 저장하기 위해 setCal 밖에 하나 만듦.
private void setCal() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
int yoil = cal.get(Calendar.DAY_OF_WEEK); // 7
int dis = yoil - 1; // 6
cal.add(Calendar.MONTH, -1);
int max = cal.getActualMaximum(Calendar.DATE);
preCount = dis;
for (int i = 0; i < dis; i++) {
itemArr.add(0, new ItemData(String.valueOf(max)));
max--;
}
cal.add(Calendar.MONTH, 1);
max = cal.getActualMaximum(Calendar.DATE);
for (int i = 0; i < max; i++) {
itemArr.add(new ItemData(String.valueOf(i + 1)));
}
cal.set(Calendar.DATE, max);
yoil = cal.get(Calendar.DAY_OF_WEEK);
dis = 7 - yoil;
for (int i = 0; i < dis; i++) {
itemArr.add(new ItemData(String.valueOf(i + 1)));
}
adapter.notifyDataSetChanged();
}
class ItemHolder {
TextView tvHolder;
}
class MyAdapter extends ArrayAdapter {
... // 겟뷰가 한번 호출될 때 마다 item이 하나씩 만들어짐.
// position % 7을 이용해서 이전달/ 주말의 색구분 가능
public View getView(int position, View convertView, ViewGroup parent) {
ItemHolder viewHolder;
if (convertView == null) {
convertView = lnf.inflate(R.layout.item, parent, false);
viewHolder = new ItemHolder();
viewHolder.tvHolder = convertView.findViewById(R.id.date_tv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemHolder) convertView.getTag();
}
viewHolder.tvHolder.setText(itemArr.get(position).str);
if (position < preCount) { //저번달은 회색, 직전의 preCount를 이용해서 if 포지션 <preCount라고 하면 색을 회색으로
viewHolder.tvHolder.setTextColor(Color.GRAY);
} else if (position % 7 == 0) { //일요일은 빨간색
viewHolder.tvHolder.setTextColor(Color.RED);
} else if (position % 7 == 6) { //토요일은 파란색
viewHolder.tvHolder.setTextColor(Color.BLUE);
} else { // 그 외에는 검은색
viewHolder.tvHolder.setTextColor(Color.BLACK);
}
return convertView;
}
}
}
여기서 우선순위도 중요
저번달 -> 일요일 / 토요일 -> 이번달 순으로해야 차례대로 색이 바뀜
dis는 원래 이번달이 시작하는 위치를 구하기 위함. 만약 1일이 수요일에 시작하면 비는 칸은 일,월,화 니까 3임.
이걸 이용해서 달력에 나타나는 저번달을 구할 수 있는 것 preCount
이전에 했던 자바 달력만들기
# 달력만들기(20.08.12)
import java.util.ArrayList;
import java.util.Calendar;
public class Main01 {
public static void main(String[] args) {
/**
* 1. 이번달의 1일로 세팅 2. 이번달 1일의 요일을 가져옴 3. 해당하는 요일부터 일요일까지 거리 4. 저번달로 이동 5. 저번달의
* 마지막 날이 몇일인지 구함 6. '3'번에 구한 값만큼 반복하면서 5번에서 구한 값을 -1 넣어줌
*
* 7. 이번달로 이동 8. 이번달의 마지막날이 몇일인지 구함 9. '8'번에 구한 값만큼 반복하면서 1부터 넣어줌
*
* 10. 이번달의 마지막날로 세팅 11. 이번달의 마지막날 요일을 구함 12. 해당하는 요일부터 토요일까지 거리를 구함 13. '12'번에
* 구한 값만큼 반복하면서 1부터 넣어줌
*/
Calendar cal = Calendar.getInstance();
// cal.set(Calendar.MONTH,0);
cal.set(Calendar.DATE, 1); // 1. 이번달의 1일로 세팅 : 8/1
int day = cal.get(Calendar.DATE);
int yoil = cal.get(Calendar.DAY_OF_WEEK); // 2. 이번달 1일의 요일을 가져옴 : 7(토요일)
int dis = yoil - 1; // 3. 해당하는 요일부터 일요일까지 거리 = 6칸
cal.add(Calendar.MONTH, -1); // 4. 저번달로 이동 : 7월
int max = cal.getActualMaximum(Calendar.DATE); // 5. 저번달의 마지막 날이 몇일인지 구함 : 31일
/**
* 6. '3'번에 구한 값만큼 반복하면서 5번에서 구한 값을 -1 넣어줌 6번 반복하면서 31부터 반복마다 -1해서 넣으세요
*/
ArrayList<Integer> calArr = new ArrayList<Integer>();
for (int i = 0; i < dis; i++) {
calArr.add(0, max); // 0번방에 max값 31을 넣으세요
max--;
}
// 이번달
cal.add(Calendar.MONTH, 1); // 7. 이번달로 이동
max = cal.getActualMaximum(Calendar.DATE); // 8. 이번달의 마지막날이 몇일인지 구함
for (int i = 0; i < max; i++) {
calArr.add(i + 1);
}
// 다음달
cal.set(Calendar.DATE, max); // 10. 이번달의 마지막날로 세팅 : 8/31
yoil = cal.get(Calendar.DAY_OF_WEEK); // 11. 이번달의 마지막날 요일을 구함 : 2(월요일)
dis = 7 - yoil;
for (int i = 0; i < dis; i++) {
calArr.add(i + 1);
}
// System.out.println(calArr.size()); //42
for (int j = 0; j < calArr.size(); j++) {
System.out.print(calArr.get(j) + " ");
if (j % 7 == 6) {
System.out.println();
}
}
}
}
**제발 까먹지 말기**
for (int i = 0; i < dis; i++) {
calArr.add(0, max); // 0번방에 max값 31을 넣으세요
arr.add(0, new ItemData(max));
max--;
ItemData를 받은 arr에 추가하려면 new ItemData() 로 해주고 그걸 다시 arr.add해줘야 함 절대 잊지말자 제발
calArr.add와 arr.add의 형식이 같아야 한다.(0, max) = (0, new ItemData(max))
더보기
전체코드
MainActivity
package com.example.gridview;
import androidx.appcompat.app.AppCompatActivity;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
//TODO 달력 만들기
GridView gv;
TextView month_tv;
MyAdapter adapter;
ArrayList<ItemData> itemArr = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gv = findViewById(R.id.gv);
adapter = new MyAdapter(this);
gv.setAdapter(adapter);
setCal();
}
int preCount = 0;
private void setCal() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
int yoil = cal.get(Calendar.DAY_OF_WEEK); // 7
int dis = yoil - 1; // 6
cal.add(Calendar.MONTH, -1);
int max = cal.getActualMaximum(Calendar.DATE);
preCount = dis;
for (int i = 0; i < dis; i++) {
itemArr.add(0, new ItemData(String.valueOf(max)));
max--;
}
cal.add(Calendar.MONTH, 1);
max = cal.getActualMaximum(Calendar.DATE);
for (int i = 0; i < max; i++) {
itemArr.add(new ItemData(String.valueOf(i + 1)));
}
cal.set(Calendar.DATE, max);
yoil = cal.get(Calendar.DAY_OF_WEEK);
dis = 7 - yoil;
for (int i = 0; i < dis; i++) {
itemArr.add(new ItemData(String.valueOf(i + 1)));
}
adapter.notifyDataSetChanged();
}
class ItemHolder {
TextView tvHolder;
}
class MyAdapter extends ArrayAdapter {
LayoutInflater lnf;
public MyAdapter(Activity context) {
super(context, R.layout.item, itemArr);
lnf = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return itemArr.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return itemArr.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ItemHolder viewHolder;
if (convertView == null) {
convertView = lnf.inflate(R.layout.item, parent, false);
viewHolder = new ItemHolder();
viewHolder.tvHolder = convertView.findViewById(R.id.date_tv);
convertView.setTag(viewHolder);
} else {
viewHolder = (ItemHolder) convertView.getTag();
}
viewHolder.tvHolder.setText(itemArr.get(position).str);
if (position < preCount) {
viewHolder.tvHolder.setTextColor(Color.GRAY);
} else if (position % 7 == 0) {
viewHolder.tvHolder.setTextColor(Color.RED);
} else if (position % 7 == 6) {
viewHolder.tvHolder.setTextColor(Color.BLUE);
} else {
viewHolder.tvHolder.setTextColor(Color.BLACK);
}
return convertView;
}
}
}
ItemData
package com.example.gridview;
public class ItemData {
String str;
public ItemData(String str) {
this.str = str;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff0000"
android:orientation="horizontal">
<TextView
android:id="@+id/title"
android:layout_marginLeft="10dp"
android:textColor="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:text="CANLENDAR" />
<TextView
android:id="@+id/month"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OCT"
android:textSize="35sp"
android:layout_alignRight="@id/day"
android:layout_alignBottom="@id/title"
android:textColor="@android:color/holo_green_light"/>
<TextView
android:id="@+id/day"
android:layout_alignLeft="@id/title"
android:layout_below="@id/title"
android:textColor="@android:color/white"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
android:text="SUN MON TUE WED THU FRI SAT" />
</RelativeLayout>
<GridView
android:id="@+id/gv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/layout"
android:numColumns="7" />
</RelativeLayout>
item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/date_tv"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="날짜"/>
</RelativeLayout>