質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.48%

  • Java

    14126questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6633questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • GitHub

    811questions

    GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

tyczj氏のExtendedCalendarViewにおける日付代入の仕組みについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 932

Knsk

score 19

標記について、カレンダーの各日付代入の仕組みが分からず困っております。
該当ライブラリは以下のものです。

https://github.com/tyczj/ExtendedCalendarView

GridViewにセットするAdapterのコンストラクタ内で、
各セルに代入する値を算出するメソッドを呼び出しているというところまではわかっているのですが、
そのメソッドがいまいち理解できません。
以下に、その該当部分を引用いたします。

public class CalendarAdapter extends BaseAdapter{
    
    static final int FIRST_DAY_OF_WEEK =0;
    Context context;
    Calendar cal;
    public String[] days;
//    OnAddNewEventClick mAddEvent;
    
    ArrayList<Day> dayList = new ArrayList<Day>();
    
    public CalendarAdapter(Context context, Calendar cal){
        this.cal = cal;
        this.context = context;
        cal.set(Calendar.DAY_OF_MONTH, 1);
        refreshDays();
    }


/*------------------------中略----------------------*/

    public void refreshDays()
    {
        // clear items
        dayList.clear();
        
        int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH)+7;
        int firstDay = (int)cal.get(Calendar.DAY_OF_WEEK);
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        TimeZone tz = TimeZone.getDefault();
        
        // figure size of the array
        if(firstDay==1){
            days = new String[lastDay+(FIRST_DAY_OF_WEEK*6)];
        }
        else {
            days = new String[lastDay+firstDay-(FIRST_DAY_OF_WEEK+1)];
        }
        
        int j=FIRST_DAY_OF_WEEK;
        
        // populate empty days before first real day
        if(firstDay>1) {
            for(j=0;j<(firstDay-FIRST_DAY_OF_WEEK)+7;j++) {
                days[j] = "";
                Day d = new Day(context,0,0,0);
                dayList.add(d);
            }
        }
        else {
            for(j=0;j<(FIRST_DAY_OF_WEEK*6)+7;j++) {
                days[j] = "";
                Day d = new Day(context,0,0,0);
                dayList.add(d);
            }
            j=FIRST_DAY_OF_WEEK*6+1; // sunday => 1, monday => 7
        }
        
        // populate days
        int dayNumber = 1;
        
        if(j>0 && dayList.size() > 0 && j != 1){
            dayList.remove(j-1);
        }
        
        for(int i=j-1;i<days.length;i++) {
            Day d = new Day(context,dayNumber,year,month);
            
            Calendar cTemp = Calendar.getInstance();
            cTemp.set(year, month, dayNumber);
            int startDay = Time.getJulianDay(cTemp.getTimeInMillis(), 
              TimeUnit.MILLISECONDS.toSeconds(tz.getOffset(cTemp.getTimeInMillis())));
            
            d.setAdapter(this);
            d.setStartDay(startDay);
            
            days[i] = ""+dayNumber;
            dayNumber++;
            dayList.add(d);
        }
    }

わからない部分は、

・finalで0宣言されたFIRST_DAY_OF_WEEKを、days配列の長さ、およびempty daysの計算に使っている意味。
(0なのだから計算式に入れても意味がないのではないか)

・populate empty days~内でfirstDay(DAY_OF_WEEK)を使って場合分けをしているが、1~7までしかないのに
elseの部分はどういう場合に呼ばれるのか

の2点です。

2点目に関しては、同様のカスタムカレンダービューを調べている中で同じような記述を見たので
一般的なものだとは思っているのですが・・・

数ヶ月前にぶつかってから、動かす分にはもちろん問題がないのである程度は気にせずにいました。
ですが、やはり使う以上は仕組みを理解していないと話にならないと思い、
WEB検索をしたり実際の年月日を例にして手計算で書き出したりしてみたのですが、わかりませんでした。

壮大な勘違いをしているのかもしれませんが、にっちもさっちもいかなくなってしまったので
この若輩者にどうかお力をお貸しください。よろしくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

おそらくコードのFIRST_DAY_OF_WEEKを0か1に書き換えることによって,
日曜日始まりのカレンダーか,月曜日始まりのカレンダーかを作り分けられるのではないでしょうか?
(だいぶ危険な構造ではありますが)
そうなると,populate empty days before first real dayでやっているのは
一番上の列の「曜日」が入る列の作成と,「1日」が入る前の空きマスの作成ではないかと思われます.

2つ目の質問ですが,if文の条件はfirstDay>1なので,firstDayが1,つまり日曜日の場合はelseに入ります.

なんだか色々無駄が多いコードにも見えますし,「思いつくままやってみたらできた」って感じのコードにも見えます.


追記
上の様に書きましたが,改めて全コードを見返してみると,
ここの仕組みだけでは月曜始まりのカレンダーになりそうもありません.
getViewの1行目の並びがsun-sutで確定しているので.
でも計算方法やら途中のコメント// sunday => 1, monday => 7を見る限り
そうしようとした意志は感じられるんですよね・・・
だからこれは月曜始まりにも対応しようとしたけど挫折した痕跡,と私は捉えます.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/04/15 22:43

    二点目はかなり基本的なところでしたね…うっかりしていました…
    一点目に関しては、そういう意図があったんですね。私も途中のコメントには引っかかってはいたのですが、何を言いたいのかはさっぱりわかりませんでした。
    初学者なもので、ある意味盲目的にこれを含めたオープンソースライブラリを信頼していたのですが、これからはより良い物にしていくというくらいの気概で頑張っていこうと思います。

    追記も含め、ご丁寧な回答を本当にありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    DATE型変数の取り扱いにつきまして

    DATE型変数に「2015/02/11」という日付の値が格納されているとします。その時この値をint型変数で 「2015」、「02」、「11」という3つの形に変換する為にはどのよう

  • 受付中

    [java][日付チェック]質問

    java初心者です。 テキストファイルを一行づつ読み込んで行く時に、 32日や14月など、異常な日付が紛れていた場合例外として処理する方法はありますでしょうか? while ((

  • 解決済

    java 日付の取得と変更について

    javaの日付の取得と変更に関するコードについて質問です 参考書のとおりに、下記のコードを書いて実行してみたのですが 実行してみても、現在の日付から5日後の日付が出力されず、現在

  • 受付中

    javaである期間の経過年月日時分秒を算出したい

    下記のようなStringで与えられる年月日時分秒 "2014/12/20 23:45:23"と 現在の時刻を比較し、 与えられた時刻から現在までyy年mmか月dd日 hh時間

  • 解決済

    java 型変換

            Calendar cal = Calendar.getInstance();         cal.add(Calendar.YEAR,-textcalk)

  • 解決済

    java カレンダー作成

    追記:JDKのバージョンは1.6.0_19です。 そして指示によりimportは使用できないようになっています。 コマンドライン引数で年月の値を引き渡し(201604の

  • 解決済

    java カレンダー 土曜日改行

    4/22質問内容を少々修正いたしました。 ?????に何を入れれば土曜日で改行となりますでしょうか? ヒントとして、【int week = cal.get(java.util.

  • 受付中

    サーブレットを直接表示させたい

    前提・実現したいこと スケジュールを登録、更新、削除するwebアプリケーションを作成しています サーブレットの名前をアドレスバーに打ち込んだら直接サーブレットの内容が表示される

同じタグがついた質問を見る

  • Java

    14126questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android

    6633questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

  • GitHub

    811questions

    GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。