【问题标题】:Android - Order Firebase Array by timestampAndroid - 按时间戳订购 Firebase 数组
【发布时间】:2017-02-01 09:58:38
【问题描述】:

我正在开发一个 android 聊天应用程序,我需要在其中按时间戳对对话详细信息进行排序。下面提到了我的 firebase 数据结构。

我尝试了以下方法。

方法 A

定义数据库引用

DatabaseReference conversationReference = mFirebaseDatabaseReference
                 .child(USERS).child(mFirebaseUser.getUid()).child(CONV_DETAILS).orderByChild("last_time_stamp").getRef();

定义 FirebaseRecycler 适配器

 mFirebaseAdapter = new FirebaseRecyclerAdapter<ConversationDetails,
                    ConversationsViewHolder>(
                    ConversationDetails.class,
                    R.layout.conversation_list_item,
                    ConversationsViewHolder.class, conversationReference) {


                @Override
                protected void populateViewHolder(ConversationsViewHolder viewHolder,
                                                  final ConversationDetails conversationDetails, int position) {
}
};

方法 B:

在字段名前加减号

conversationReference = mFirebaseDatabaseReference
                .child(USERS).child(mFirebaseUser.getUid()).child(CONV_DETAILS).orderByChild("-last_time_stamp").getRef();

这两种情况都不起作用,仅按存储在 firebase 数据库中的数组顺序显示。但是,我需要先显示具有较高值 last_time_stamp 的对话详细信息。

请任何人帮助我找到解决方案。

【问题讨论】:

  • 是在创建条目时使用 ServerValue 生成的时间戳吗?
  • 方法 B 不可用,您无法更改密钥。方法 A 应该有效。删除 get Ref 并使用 Query。
  • @gbaccetta 是的,已插入 SeverValue.TIMESTAMP 值
  • @drulabs 。让我试试这个并恢复你。
  • 在你的 RecyclerView 和 ListView 中使用 reverseLayout = true。那应该行得通。 Yiou 也可以根据需要添加 stackFromEnd

标签: android firebase firebase-realtime-database


【解决方案1】:

使用Query查询数据并执行orderByValue()。这总是按升序提供数据。因此您可以反转数据,或翻转Recycler 视图以显示最新聊天。

不要忘记添加限制。使用 limit 从升序列表中获取最后一项。

Query chatQuery = conversationReference.orderByChild("last_time_stamp"). limitToLast(20);

这将为您提供 20 个按时间戳升序排列的最新聊天记录。现在翻转这个列表并使用它。

或者您可以随时在您的回收站视图中将reverseLayout 设置为true。 还要将setStackFromEnd 添加到true

【讨论】:

  • 如果我将反向布局设置为 true ,它可以工作,但列表移动到底部并且列表顶部为空
  • 设置 StackFromBottom = false 并且应该修复
  • 我也做到了,但没有突破:-(
  • 如果我将两者都设置为 true,就像 mLLinearLayoutManager.setReverseLayout(true); mLLinearLayoutManager.setStackFromEnd(true); .. 感谢@drulabs 和 gbaccetta 的宝贵帮助。请编辑您的答案,以便对其他人也有帮助。
【解决方案2】:

只需将其添加到 firebase 回收器适配器中 -

@Override
        public ModelClass getItem(int position) {
            return super.getItem(getItemCount() - 1 - position);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多