根据 Firebase 的最新日期将数据排序到 RecyclerView

Posted

技术标签:

【中文标题】根据 Firebase 的最新日期将数据排序到 RecyclerView【英文标题】:Sort data to RecyclerView based on latest date from Firebase 【发布时间】:2021-12-15 11:42:25 【问题描述】:

我正在开发一个 android 聊天应用程序,我需要在其中按日期订购对话详细信息。下面提到了我的 firebase 数据结构。

现在我想根据时间戳从 Firebase 实时数据库中检索并显示我的 RecyclerView 上最新日期的数据。

我尝试了以下方法。

final DatabaseReference nm =
        FirebaseDatabase.getInstance().getReference("Transaction");

Query query = nm.orderByChild("Date").limitToFirst(5);
;

query.addValueEventListener(new ValueEventListener() 
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
        listData.clear();
        if (dataSnapshot.exists()) 
            for (DataSnapshot npsnapshot : dataSnapshot.getChildren()) 
                Transaction ld = npsnapshot.getValue(Transaction.class);

                listData.add(ld);
            
            Tadapter = new TransactionAdapter(listData);
            rv.setAdapter(Tadapter);
            Log.d(TAG, "Total Count" + Tadapter.getItemCount());
        
    

【问题讨论】:

【参考方案1】:

我正在开发一个 Android 聊天应用程序,我需要在其中按日期订购对话详细信息。

正如我在您的屏幕截图中看到的,您的 Date 属性是字符串类型。这意味着您不能调用:

.orderByChild("Date")

并期望表现得像时间戳一样。当您订购 String 元素时,您得到的顺序始终是 lexicographically。这意味着字符串在排序时不考虑任何类型的数值,尤其是在涉及日期时,即使日期包含数字,就像您的第一个元素一样:

Date: "30/7/2021"

因此,在查询数据库时使用字符串值不是一种选择。但是,我看到您已经拥有 Timestamp 属性。也许在那个属性上,它应该进行排序。如果不是这种情况,我建议您将 Date 属性的类型从 String 更改为 Timestamp,正如我在以下帖子中的回答中所述:

How to save the current date/time when I add new value to Firebase Realtime Database

现在我想在我的 RecyclerView 上检索并显示最新日期的数据

这意味着您很可能需要颠倒顺序,这意味着您的所有交易都必须以降序显示在您的 RecyclerView 中。在这种情况下,您可以在服务器上或客户端上使用一些选项。

假设您已将 Date 属性的类型从 String 更改为 Timestamp,那么您可以简单地考虑存储倒置的 Timestamp 值,如下所示:

Firebase-root
  |
  --- transactions
        |
        --- 1
            |
            --- Date: 1627714194
            |
            --- invertedDate: -1627714194

看,invertedDate 属性是负值。由于默认情况下,元素是按升序排列的,为了能够对事务进行降序排列,您应该简单地使用:

Query query = nm.orderByChild("invertedDate").limitToFirst(5);

另一方面,可以通过一些变通方法在客户端上实现相同的功能,正如我在以下帖子中的回答中所解释的那样:

How to arrange firebase database data in ascending or descending order?

【讨论】:

如果您认为我的回答对未来的 Firebase 开发人员也有帮助,也请考虑 giving a vote-up (▲)。我真的很感激。谢谢!【参考方案2】:
Query query = nm.orderByChild("Date").limitToFirst(5);

Firebase 实时数据库按升序排序,这意味着您将收到的 5 个节点将是最旧的。

我想检索并显示最近日期的数据

尝试改用limitToLast,这将在按日期字段排序节点后返回最后5个文档,即5个最新节点。

Query query = nm.orderByChild("Date").limitToLast(5);

您可以在sorting and filtering data 阅读更多相关信息。

【讨论】:

以上是关于根据 Firebase 的最新日期将数据排序到 RecyclerView的主要内容,如果未能解决你的问题,请参考以下文章

如何将Firebase Recycler视图从最新(列表顶部)排序到最旧[重复]

按日期对 Firebase 数据进行排序

减少查询大小:根据最新日期将新数据附加到 Big Query 表

如何按日期对字典数组进行排序?

使用 firebase 按最新消息对聊天列表进行排序

从最新到最旧正确排序节点