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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Android

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

GitHub

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

Q&A

解決済

1回答

2100閲覧

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

Knsk

総合スコア22

Java

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

Android

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

GitHub

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

0グッド

0クリップ

投稿2015/04/14 10:10

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

https://github.com/tyczj/ExtendedCalendarView

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

lang

1public class CalendarAdapter extends BaseAdapter{ 2 3 static final int FIRST_DAY_OF_WEEK =0; 4 Context context; 5 Calendar cal; 6 public String[] days; 7// OnAddNewEventClick mAddEvent; 8 9 ArrayList<Day> dayList = new ArrayList<Day>(); 10 11 public CalendarAdapter(Context context, Calendar cal){ 12 this.cal = cal; 13 this.context = context; 14 cal.set(Calendar.DAY_OF_MONTH, 1); 15 refreshDays(); 16 } 17 18 19/*------------------------中略----------------------*/ 20 21 public void refreshDays() 22 { 23 // clear items 24 dayList.clear(); 25 26 int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH)+7; 27 int firstDay = (int)cal.get(Calendar.DAY_OF_WEEK); 28 int year = cal.get(Calendar.YEAR); 29 int month = cal.get(Calendar.MONTH); 30 TimeZone tz = TimeZone.getDefault(); 31 32 // figure size of the array 33 if(firstDay==1){ 34 days = new String[lastDay+(FIRST_DAY_OF_WEEK*6)]; 35 } 36 else { 37 days = new String[lastDay+firstDay-(FIRST_DAY_OF_WEEK+1)]; 38 } 39 40 int j=FIRST_DAY_OF_WEEK; 41 42 // populate empty days before first real day 43 if(firstDay>1) { 44 for(j=0;j<(firstDay-FIRST_DAY_OF_WEEK)+7;j++) { 45 days[j] = ""; 46 Day d = new Day(context,0,0,0); 47 dayList.add(d); 48 } 49 } 50 else { 51 for(j=0;j<(FIRST_DAY_OF_WEEK*6)+7;j++) { 52 days[j] = ""; 53 Day d = new Day(context,0,0,0); 54 dayList.add(d); 55 } 56 j=FIRST_DAY_OF_WEEK*6+1; // sunday => 1, monday => 7 57 } 58 59 // populate days 60 int dayNumber = 1; 61 62 if(j>0 && dayList.size() > 0 && j != 1){ 63 dayList.remove(j-1); 64 } 65 66 for(int i=j-1;i<days.length;i++) { 67 Day d = new Day(context,dayNumber,year,month); 68 69 Calendar cTemp = Calendar.getInstance(); 70 cTemp.set(year, month, dayNumber); 71 int startDay = Time.getJulianDay(cTemp.getTimeInMillis(), 72 TimeUnit.MILLISECONDS.toSeconds(tz.getOffset(cTemp.getTimeInMillis()))); 73 74 d.setAdapter(this); 75 d.setStartDay(startDay); 76 77 days[i] = ""+dayNumber; 78 dayNumber++; 79 dayList.add(d); 80 } 81 }

わからない部分は、

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

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

の2点です。

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

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/14 12:23

編集2015/04/14 15:17
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Knsk

2015/04/15 13:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問