Java Firebase Android:按顺序加入并返回数据

Java Firebase Android:按顺序加入并返回数据,java,android,firebase,join,Java,Android,Firebase,Join,我正在开发与firebase的群聊。 Firebase的数据库如下所示: 根目录 信息 groupId -uuid 内容:“你好” 类型:“消息” 发送者标识:“uuid” -uuid 内容:“你好” 类型:“计划” 发送者标识:“uuid” 计划id“uuid” 使用者 uuid 名称:“用户名” 头像:“url” 计划 uuid: 内容:“废话” 地点:“诸如此类” 例如:我想在RecyclerView中显示消息,要显示用户信息,我将执行另一个操作。如果消息的类型是plan,我将执行一个以

我正在开发与firebase的群聊。 Firebase的数据库如下所示:
根目录
信息
groupId
-uuid
内容:“你好”
类型:“消息”
发送者标识:“uuid”
-uuid
内容:“你好”
类型:“计划”
发送者标识:“uuid”
计划id“uuid”
使用者
uuid
名称:“用户名”
头像:“url”
计划
uuid:
内容:“废话”
地点:“诸如此类”
例如:我想在RecyclerView中显示消息,要显示用户信息,我将执行另一个操作。如果消息的
类型是plan,我将执行一个以上的操作。
我知道数据去规范化是正常的,但我需要坚持数据库设计。
我使用
ChildEventListener
获取消息,然后使用
SingleValueEvent
读取
users
,如果
type
是plan,则使用
SingleValueEvent
读取
计划。
这就是我从firebase获取数据的方式

mDatabaseReference.child(FIREBASE_CHILD_MESSAGE)
    .child(String.valueOf(mConversation.getId()))
    .orderByKey()
    .limitToLast(mLimit)
    .addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    Message message = dataSnapshot.getValue(Message.class);
                    String userPath = "users/" + message.getSenderId();
                    mDatabaseReference.child(userPath)
                            .addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    User user = dataSnapshot.getValue(User.class);
                                    message.setSenderAvatar(user.getAvatar());
                                    message.setSenderName(user.getName());
                                    if (message.getMessageType() == Message.PLAN) {
                                        mDatabaseReference.child(FIREBASE_CHILD_PLANS)
                                                .child(message.getReferenceId())
                                                .addValueEventListener(new ValueEventListener() {
                                                    @Override
                                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                                        Plan plan = dataSnapshot.getValue(Plan.class);
                                                        message.setPlan(plan);
                                                        if (getMvpView() != null) {
                                                            getMvpView().showAddedMessage(message);
                                                        }
                                                    }

                                                    @Override
                                                    public void onCancelled(DatabaseError databaseError) {

                                                    }
                                                });
                                    } else {
                                        getMvpView().showAddedMessage(message);
                                    }
                                }

                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });

                }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                //TODO
            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {
                //TODO
            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
    });
正确的顺序应为1到15。但如果消息类型为plan,并且我还需要一次读取操作,则不是这样。
消息1
信息2
信息3
信息4
信息6
信息7
信息8
信息10
信息11
信息12
信息14
信息15
信息5//计划
信息9/计划
信息13/计划

目前,我正在使用MVP,最好从Presenter读取所有数据,并将其发送到View。所以我的问题是,如何才能以正确的顺序返回结果

请将recyclerView代码与view共享好吗?它相当长,因为我有许多viewholder(每条消息的传入、传出、计划、日期),但它只是带有
SortedList
@quanlt的普通recyclerView适配器。要增加获得帮助的机会,请创建一个单独的。这有助于隔离问题并减少需要共享的代码(因此我们需要阅读以提供帮助)。适配器中消息的重新排序听起来像是许多问题的潜在根源。您不能使用查询以正确的顺序检索消息吗?我刚刚更新了问题以关注我的问题。感谢您的帮助@FrankvanPuffelen。如果我脱机发送消息并连接到网络,则recyclerview中的消息顺序是错误的。所以我需要重新排序。但这应该是另一个问题:)