카테고리 없음

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>