如何在android的recyclerview中将最新项目标记为“新”?

Posted

技术标签:

【中文标题】如何在android的recyclerview中将最新项目标记为“新”?【英文标题】:How to marked as "new" to newest items in the recycler view in anroid? 【发布时间】:2021-10-21 11:05:05 【问题描述】:

我有一些项目要通过回收站视图显示在 android 应用程序中。我已经成功实现并从服务器获取数据。项目显示在回收站视图列表中。我还对列表顶部的最新项目进行了排序。我已经在后端使用 php 代码和 SQL 对列表顶部的最新项目进行排序并成功完成。但现在我想在列表中实现这样的文本:- NEW。这意味着它只会显示最新项目并在 5 天后自动删除。

我已经在前端成功实现了新标签并且它正在显示,但是新标签只显示当前日期。 我想再展示 5 天的“新”标签。我提出了逻辑,但它对我没有帮助,并且仅显示当前日期。这是我显示 NEW 的代码:-

MyAdapter 类 --> onBindViewHolder()

Json data:-
"creation_date": "2021-09-06"

final String creation_date = ModelClass.getCreation_date(); //JSON data "creation date". getCreation_date() invoking Getter method from model class"

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

Calendar c = Calendar.getInstance();

String Current_date = sdf.format(c.getTime());

c.add(Calendar.DAY_OF_MONTH, 5); //here I have increase the date to 5
String EndDate = sdf.format(c.getTime());


 if (Current_date.equals(creation_date)) 
                        myViewHolder.creation_date.setVisibility(View.VISIBLE);
                    

                     else if (creation_date.equals(EndDate)) 
                        myViewHolder.creation_date.setVisibility(View.VISIBLE);
                     else 
                        myViewHolder.creation_date.setVisibility(View.GONE);
                    

主要问题是如何在创建日期再显示 5 天和 5 天后显示 NEW 标签 Textview(creation_date) Visibility will be GONE?

现在如果我的创建日期与当前日期相同,那么它会显示新标签,但我想再显示 5 天,5 天后它应该被删除。

现在输出显示如下:-

【问题讨论】:

后端通常由三部分组成:服务器、应用程序和数据库。所以在我的情况下,它是一个数据库,或者你可以说一个服务器。 @javdromero 一些需要补充的细节:每个项目数据当前是否有一个与之关联的日期/时间,回收站视图实现可以访问?您是否能够更新项目布局,或者您是否仅限于每个项目的单行文本?您需要日期时间算术方面的帮助吗? 如果是日期时间算术,那么是的,我需要帮助。现在我不知道如何实现这个功能。请记住,当我们打开任何电子商务应用程序或类似的东西时,我们会看到产品上突出显示的“新”标签,这是我想要实现的。 @安迪 【参考方案1】:

这个答案会帮助你。试试看,如果您遇到任何错误,请告诉我... 我已经使用了您上面的示例代码。这是我的代码版本:


final String creation_date = storiesModel.getCreation_date();

                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

                    SimpleDateFormat Cussdf = new SimpleDateFormat("yyyy-MM-dd");

                    Calendar c = Calendar.getInstance();

                    //new
                    Calendar cust = Calendar.getInstance();

                    try 
                        cust.setTime(Cussdf.parse(creation_date));
                     catch (ParseException e) 
                        e.printStackTrace();
                    

                    cust.add(Calendar.DAY_OF_MONTH, 1);
                    String customIncreDate = Cussdf.format(cust.getTime());
                    System.out.println("Your custom Increment creation date is: "+customIncreDate);


                    //another one

                    Calendar customDate = Calendar.getInstance();

                    try 
                        customDate.setTime(Cussdf.parse(creation_date));
                     catch (ParseException e) 
                        e.printStackTrace();
                    

                    customDate.add(Calendar.DAY_OF_MONTH,2); //for next increment create all "//another one" whole code and increase 2 to 3 for next 3 days
                    String CustomInDate = Cussdf.format(customDate.getTime());
                    System.out.println("Your 2nd custom Increment creation date is: "+CustomInDate);

                    //another one

                    //new

                    String Current_date = sdf.format(c.getTime());

                    c.add(Calendar.DAY_OF_MONTH, 1);//this is increment the current date only
                    String EndDate = sdf.format(c.getTime());


                    if (Current_date.equals(creation_date)) 

                        myStoryViewHolder.creation_date.setVisibility(View.VISIBLE);
                    
                    else if (Current_date.equals(customIncreDate)) //It is showing!!
                        myStoryViewHolder.creation_date.setVisibility(View.VISIBLE);
                    

                     else if (Current_date.equals(CustomInDate)) 
                        myStoryViewHolder.creation_date.setVisibility(View.VISIBLE);
                     else 
                        myStoryViewHolder.creation_date.setVisibility(View.GONE);
                    


Calendar c = Calendar.getInstance(); 这将有助于创建日历实例,然后我们将使用add() 方法在给定的日期字符串中添加日期。像这样:- c.add(Calendar.DAY_OF_MONTH, 1)

为了增加日历实例中的日期,我从这个站点获得了帮助:- https://beginnersbook.com/2017/10/java-add-days-to-date/

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。【参考方案2】:

在您创建新项目时,只需将“NEW”关键字的对象放在后端即可。然后在 java 的前端或您正在使用的任何东西上检查它。 您将拥有正在填充数据的适配器的项目布局,因此也会有一个“新”项目的布局,这对于普通项目是不可见的。因此,当您找到关键字“NEW”时,您可以显示显示“NEW”关键字的布局,该关键字到目前为止是不可见的。

那是前端的。

现在是你的删除逻辑。

如果您想在 5 天后删除项目,则将该持续时间放在您希望在 5 天后删除的项目中。在用户下次打开您的应用程序时验证项目,如果您给的时间已经过去,则从数组列表中删除该项目,或者如果您有删除 API,您可以从服务器中删除它。

如果您有任何困惑,请告诉我,否则很好。

【讨论】:

感谢您的回答,我不想在后端手动放置 NEW 关键字。取而代之的是,我创建了一个名为“创建日期”的字段,并使用 Getter 方法调用了该字段,然后与当前系统日期进行比较。它正在显示新标签,但现在我想显示更多 5 天,5 天后它将不可见。 您是否尝试将数据保存在sqlite 中?您可以比较两个数据集 - 一个来自服务器,一个来自数据库,如果服务器显示尚未保存在 sqlite 中的新数据以及它不满足您的创建日期条件,那么您可以将它们显示为 NEW。让我知道你的想法。 好吧,让我试试 sqlite。但是有没有别的办法?我的意思是,如果我在后端 SQL 中创建一个名为过期日期的字段并作为 JSON 获取,然后给出从创建日期到过期日期的条件......?然后它将在日期内显示 TextView 并在到期后可见性消失... 好的。看。如果您想为所有用户展示相同的新产品,那么您可以这样做。我认为这是针对不同用户的不同新项目。是的,如果所有用户都获得相同的新项目,您可以使用该解决方案。 谢谢。。是的,我想为所有用户展示相同的新产品,因为我没有添加任何登录或注册功能...我还有一个问题,我想你可以帮助我, 如何在 JAVA 中放置逻辑,如果我只获取创建日期的数据..?意味着创建日期将是 06-09-2021 (dd-MM-yyyy)。并且到期日期将从创建日期开始计算...您能告诉我该怎么做吗...?

以上是关于如何在android的recyclerview中将最新项目标记为“新”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在android的recyclerview中将最新项目标记为“新”?

有没有办法在 Android Studio 编辑器中将 RecyclerView 的内容预览显示为网格?

翻译Android RecyclerView CardView

一起Talk Android吧(第五百零一回:如何正确地更新RecyclerView中的数据)

Android - 在 onCreateViewHolder(..) 中将数据传递给 ViewHolder 构造函数

如何在 Kotlin 中将 listView 转换为 RecyclerView