2016-04-30 15 views
1

現在の日付をタブに表示しようとしていますが、左側の日付が1つ減少していません。何が間違っているのですか?どんな助けでも感謝します、ありがとう。タブに日付を設定する

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    Calendar cal = Calendar.getInstance(); 
    DateFormat dateFormat1 = new SimpleDateFormat("EEEE, MMM dd, yyyy", Locale.getDefault()); 


    for (int j = 0; j < 2; j++){ 
     cal.add(Calendar.DATE, -1); 
     String yest = dateFormat1.format(cal.getTime()); 
     adapter.addFragment(new ThreeFragment(), yest); 
    } 

    String todate = dateFormat1.format(cal.getTime()); 
    adapter.addFragment(new OneFragment(), todate); 

    for(int i = 0; i < 2; i++) { 
     cal.add(Calendar.DATE, 1); 
     String tomo = dateFormat1.format(cal.getTime()); 
     adapter.addFragment(new TwoFragment(), tomo); 

    } 

    viewPager.setAdapter(adapter); 
} 

enter image description here

+1

回答を受け取るためには、 'javascript'タグを削除し、' java'asタグを追加する必要があります。これはjavascriptとは関係ありません。 – marvinhagemeister

答えて

1

不正なロジック

あなたのコードの背後にある論理は間違っています。今日は例えば30日です。あなたのコードが「今日」になった時点で、あなたはすでに2日を削除しています。だからあなたのコードは "今日"のように見える28番目です。

todateを生成する2つのループの間にadd-1と呼ぶことはないため、日付は最初のループの最後の時刻と同じになります。

コードをコピーし、ViewPageAdapterをSystem.out.println呼び出しに置き換えました。

Calendar cal = Calendar.getInstance(); 
DateFormat dateFormat1 = new SimpleDateFormat ("EEEE, MMM dd, yyyy" , Locale.getDefault()); 
System.out.println ("cal: " + dateFormat1.format (cal.getTime())); 

for (int j = 0 ; j < 2 ; j ++) { 
    cal.add (Calendar.DAY_OF_MONTH , -1); 
    String yest = dateFormat1.format (cal.getTime()); 
    System.out.println ("yest: " + yest); 
} 

String todate = dateFormat1.format (cal.getTime()); 
System.out.println ("todate: " + todate); 

for (int i = 0 ; i < 2 ; i ++) { 
    cal.add (Calendar.DATE , 1); 
    String tomo = dateFormat1.format (cal.getTime()); 
    System.out.println ("tomo: " + tomo); 
} 

実行時。

cal: Saturday, Apr 30, 2016 
yest: Friday, Apr 29, 2016 
yest: Thursday, Apr 28, 2016 
todate: Thursday, Apr 28, 2016 
tomo: Friday, Apr 29, 2016 
tomo: Saturday, Apr 30, 2016 
あなたが悪い混乱、設計されており、面倒なことが証明されている古いレガシー日時クラスを使用している

レガシークラス

。それらも変更可能で、コードのロジックの欠陥に貢献します。

java.time

古いクラスは、後のJava 8とに組み込まれたjava.timeフレームワークに取って代わられています。その機能の多くは、ThreeTen-BackportプロジェクトのJava 6 & 7にバックポートされ、さらにThreeTenABPプロジェクトのAndroidに適応しています。

java.timeクラスはImmutable Objectパターンを使用します。オブジェクトを変更(「変更」)するのではなく、元の値に基づいて新しいオブジェクトが作成されます。

時間のみがなくタイムゾーンがない場合は、LocalDateを使用してください。

別の問題はタイムゾーンです。あなたのコードはこの重要な問題を無視しています。 「今日」を決定するには、世界中のさまざまな日付としてタイムゾーンが必要です。省略すると、JVMの現在のデフォルトのタイムゾーンが適用されます。明示的にすることをお勧めします。 LocaleのDittoは、以下のコードで見られるように、JVMの現在のデフォルトに頼るよりも明示的である方が良いです。

ここに私のバージョンのコードがあり、ループはありません。

ヒント:通常は、最初に構築および整理されたビジネスオブジェクト(ここではオブジェクト)を取得するのが最適です。プレゼンテーションとは別に保存されます(Stringの値が表示されます)。

ZoneId zoneId = ZoneId.of ("America/Montreal"); 
LocalDate today = LocalDate.now (zoneId); 

LocalDate yesterday = today.minusDays (1); 
LocalDate dayBeforeYesterday = yesterday.minusDays (1); 

LocalDate tomorrow = today.plusDays (1); 
LocalDate dayAfterTomorrow = tomorrow.plusDays (1); 

List<String> days = new ArrayList<> (5); 
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate (FormatStyle.MEDIUM); 
formatter = formatter.withLocale (Locale.US); // Or Locale.CANADA, LOCALE.CANADA_FRENCH. 
days.add (dayBeforeYesterday.format (formatter)); 
days.add (yesterday.format (formatter)); 
days.add (today.format (formatter)); 
days.add (tomorrow.format (formatter)); 
days.add (dayAfterTomorrow.format (formatter)); 

System.out.println ("today: " + today); 
System.out.println ("days: " + days); 

実行時。

today: 2016-04-30 
days: [Apr 28, 2016, Apr 29, 2016, Apr 30, 2016, May 1, 2016, May 2, 2016] 
+0

詳細な回答ありがとうございました! –

+0

実際これは私のために働いていません。私は正しいタグで質問を再質問します。とにかく助けてくれてありがとう。 –

関連する問題