在 RecyclerView 中比较来自 JSON 结果的两个日期

Compare two date from JSON result in RecyclerView

我得到了一个 recyclerView,它将使用 databinding 根据 JSON 结果进行填充,我想做的是到 check/compare 开始日期和过期日期 看看 "Deals" 是否已过期(如果已过期,将出现带有文本 "DEALS EXPIRED" 的文本视图)

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

这是我的一些问题:
* 我应该使用 DATE / String 来存储对象吗?
* 我应该在哪里执行此操作?在我的片段/适配器下?
感谢提供任何来源/示例。

<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"
      />

should i use DATE / String to store the object?

是的,您必须将这两个值都保存在日期或字符串中。

where should i perform this action? under my fragment / adapter?

您必须在您的适配器中执行此功能。同时填充要查看的数据。

比较日期:

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
}

希望对您有所帮助!!

您可以使用时间戳来进行这种时间检查。在您的 json 中发送开始和结束时间戳。您可以在适配器中执行此操作。

是的,我认为你应该使用 Date 来表示开始日期,无论你有什么其他日期,它都更有意义。

我认为您的 Adapter/View 不是进行此转换的最佳位置。你应该让你的解析器为你做这些,或者你可以在你的 List 对象从网络中获取后对它们进行一些 post 处理。甚至最好在后台线程上。

在您的 Adapter 中将那些 String 解析为 Date 是一种浪费,并且可能会使您的 RecyclerView 有点滞后。这将导致重复计算相同的值,并可能在 UI 线程上进行冗长的日期解析。

* 我应该在哪里执行此操作?在我的片段/适配器下? 在适配器的 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;
    }
}
  • 首先,如果您想将 textview 文本更改为 "DEALS EXPIRED",您应该在适配器下执行操作。
  • 如果您不想再次解析字符串,您可以将日期存储为日期对象。

你可以这样解析你的日期。

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.
}