在 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.
}
我得到了一个 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.
}