0

アダプターに渡すクエリを使用してカーソルをロードした後、Android でこのコードを実行しますが、日付はミリ秒形式で長いため、アダプターをロードする前に適切にフォーマットする必要があります! 問題は、このコードが 50 項目のロードを渡すのに 14 秒かかっていることです。アダプタ getView 内で呼び出すと問題が悪化します。スクロールすると遅くなります。この関数を取り出すと、プログラムはスムーズに実行されます。

これは私のリストフラグメント内の呼び出しです

private String dateFormatPatternEdited(long timeMS) {
    android.text.format.DateFormat df = new android.text.format.DateFormat();
    final Calendar eDate = Calendar.getInstance();
    Calendar sDate = Calendar.getInstance();
    sDate.setTimeInMillis(timeMS);
    long daysBetween = 0;
    while (sDate.before(eDate)) {
        sDate.add(Calendar.DAY_OF_MONTH, 1);
        daysBetween++;
    }
    String mDateFormatPattern = FuelTrackerApplication.dateFormat.format(timeMS);
    if (daysBetween < 2){
        mDateFormatPattern = FuelTrackerApplication.timeFormat.format(timeMS);
    } else if(daysBetween < 365){
        mDateFormatPattern = df.format(FuelTrackerApplication.dateFormatPattern,timeMS).toString();
    }
    return mDateFormatPattern;
}

これは、FuelTrackerApplication の onCreate 内で呼び出される日付形式を初期化したものです。これに問題はないと思います。

public void initializeDateFormat() {
    android.text.format.DateFormat df = new android.text.format.DateFormat();
    dateFormatPattern = "MMM dd";
    if (android.os.Build.VERSION.SDK_INT >= 18){
        dateFormatPattern = df.getBestDateTimePattern(Locale.getDefault(), dateFormatPattern);
    }
    dateFormat = df.getMediumDateFormat(getApplicationContext());
    timeFormat = df.getTimeFormat(getApplicationContext());
    dateFormat2 = df.getLongDateFormat(getApplicationContext());
}
4

2 に答える 2

1

わかりました、ほんのいくつかのこと。日付がどれくらい前にさかのぼるかによって異なります。その間の日数が 365 日を超える場合にのみ関心があります。したがって、日付が何年も前にさかのぼる場合は、余分な作業を行っていることになります。

while (sDate.before(eDate) && daysBetween <= 365) {
    sDate.add(Calendar.DAY_OF_MONTH, 1);
    daysBetween++;
}

つまり、5 年前にさかのぼる 20 のエントリがある場合、それほど多くの作業を行う必要はありません。

ミリ秒の差を確認するだけでも価値があるかもしれません。これが十分に正確かどうかはわかりませんが、うまくいくはずです。これは、すべてをループする必要がないことを意味します。

long millisecondsToday = getMilliseconds;
long timeMs = // you already have this

long millisecondsDifference = millisecondsToday - timeMs;
if (millisecondsDifference < MILLISECONDS_TWO_DAYS) // set a final variable out of this method
// etc

メソッドの外で変数の一部を初期化する場合にも価値があるかもしれません。あなたの のようにdf、それは 50 回作成されてから、何かが設定されています。あなたと同じeDateです。

于 2013-09-12T06:21:57.807 に答える