Сравните две даты из результата JSON в RecyclerView - PullRequest
0 голосов
/ 14 мая 2018

Я получил recyclerView , который будет заполняться в соответствии с результатом JSON с использованием привязки данных . Я хочу проверить / сравнить дату начала и дату истечения срока действия чтобы увидеть, что срок действия предложения истек (если срок действия истек, появится текстовое представление с текстом «Сдал срок действия»)

"DealsPageInfo": [
    {
      "DisplayName": "string",
      "StartDate": "2018-04-27T03:06:18.890Z",
      "ExpiredDate": "2018-04-27T03:06:18.890Z",
      "Url": "string",
      "ImageUrl": "string",
      "ShortDescription": "string"
    }

Вот несколько вопросов от меня:
* следует ли мне использовать DATE /Строка для хранения объекта?
* где я должен выполнить это действие?под моим фрагментом / адаптером?
Ценю, если какой-либо источник / пример предоставлен.

<TextView
      android:id="@+id/list_offers_startDate"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginRight="3dp"
      android:text="@{offers.StartDate}"
      android:textColor="@color/colorGrayText"
      android:textSize="@dimen/list_fontsize"
      />

 <TextView
      android:id="@+id/list_offers_endDate"
      android:visibility="gone"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_marginLeft="3dp"
      android:text="@{offers.ExpiredDate}"
      android:textColor="@color/colorGrayText"
      android:textSize="@dimen/form_fontsize"
      />

Ответы [ 5 ]

0 голосов
/ 14 мая 2018
  • Во-первых, если вы хотите изменить текстовое представление на «СРОКИ СДЕЛКИ», вы должны выполнить действие под вашим адаптером.
  • Если вы не хотите снова анализировать строку, вы можете сохранить дату как объект Date.

Вы можете разобрать свою дату следующим образом.

Instant instant = Instant.parse( "2018-04-27T03:06:18.890Z" );
Date date = java.util.Date.from( instant );
if ( Calendar.getInstance().after( date ) ) {
    // if this statement is true deal is expired.
}
0 голосов
/ 14 мая 2018

* где я должен выполнить это действие? под моим фрагментом / адаптером? выполните это в onBindViewHolder вашего адаптера,

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position){
        if (isDateExpired(listItems.get(position).getStartDate(),listItems.get(position).getEndDate())){
            viewHolder.dealsExpiredtextview.setVisibility(View.GONE);
        }else {
            viewHolder.dealsExpiredtextview.setVisibility(View.VISIBLE);

        }
    }

добавьте этот метод в свой адаптер,

public boolean isDateExpired(String startDate, String endDate) {
    SimpleDateFormat dfDate = new SimpleDateFormat("dd-MM-yyyy");
    boolean b = false;
    try {
        if (dfDate.parse(startDate).before(dfDate.parse(endDate))) {
            return true;  // If start date is before end date.
        } else if (dfDate.parse(startDate).equals(dfDate.parse(endDate))) {
            return false;  // If two dates are equal.
        } else {
            return false; // If start date is after the end date.
        }
    } catch (ParseException e) {
        e.printStackTrace();
        return false;
    }
}
0 голосов
/ 14 мая 2018

Вы можете использовать отметку времени, чтобы выполнить такую ​​проверку времени. Отправьте начало и конец отметки времени в вашем JSON. И вы можете сделать это в своем адаптере.

0 голосов
/ 14 мая 2018

Да, я думаю, вы должны использовать Date для представления даты начала и любой другой даты, которую вы имеете, это имеет больше смысла.

Я не думаю, что ваш Adapter / View - лучшее место дляэто преобразование.Вы должны либо сделать так, чтобы ваш синтаксический анализатор сделал это за вас, либо вы можете выполнить некоторую постобработку ваших List объектов, как только они будут получены из сети.Предпочтительно даже в фоновом потоке.

Анализ этих String s до Date s в вашем Adapter является расточительным и может сделать ваш RecyclerView немного запаздывающим.Это приведет к повторным вычислениям одних и тех же значений и, возможно, к длительному анализу даты в потоке пользовательского интерфейса.

0 голосов
/ 14 мая 2018

я должен использовать DATE / String для хранения объекта?

Да, вы должны сохранить оба значения в Date или в строке.

где я долженвыполнить это действие?под моим фрагментом / адаптером?

Вы должны выполнить эту функцию в вашем адаптере.пока заполняете данные для просмотра.

сравните дату:

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date StartDate= sdf.parse(StartDate);
Date ExpiredDate= sdf.parse(ExpiredDate);
if (StartDate.after(ExpiredDate)) {
    //create your logic here
}

Надеюсь, это поможет вам !!

...