首页 > 解决方案 > FirebaseRecyclerAdapter 中的数据库查询

问题描述

代码:

        FirebaseRecyclerOptions<MessagesHelper> options =
            new FirebaseRecyclerOptions.Builder<MessagesHelper>()
                    .setQuery(mFetchingMessages, MessagesHelper.class)
                    .build();
    firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<MessagesHelper, Chat.MessagesViewHolder>(options) {

        @Override
        protected void onBindViewHolder(@NonNull final Chat.MessagesViewHolder holder, final int position, @NonNull final MessagesHelper model) {
            holder.setMessage(model.getMessage());


            final String userId = getRef(position).getKey();
            final DatabaseReference mTimeReference = FirebaseDatabase.getInstance().getReference().child("Messages").child(MessageSenderId).child(MessageRecieverId);
            Query messageQuery = mTimeReference.limitToLast(10);
            messageQuery.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    final String from_user = model.getFrom();
                    final boolean Seen = model.isSeen();
                        MessagesHelper message = dataSnapshot.getValue(MessagesHelper.class);

                    itemPos++;

                    if(itemPos == 1){

                        String messageKey = dataSnapshot.getKey();

                        mLastKey = messageKey;
                        mPrevKey = messageKey;

                    }


                        if (from_user != null && from_user.equals(MessageSenderId)) {
                            holder.mDisplayMessage.setBackgroundColor(Color.BLUE);
                            holder.mDisplayMessage.setBackgroundColor(Color.WHITE);

                            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mDisplayMessage.getLayoutParams();
                            params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
                            params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                            holder.mDisplayMessage.setLayoutParams(params);
                            mTimeReference.keepSynced(true);


                            if (Seen == true) {
                                holder.mDisplayMessage.setBackgroundColor(Color.CYAN);
                                mTimeReference.keepSynced(true);

                            } else {
                                holder.mDisplayMessage.setBackgroundColor(Color.BLUE);
                                mTimeReference.keepSynced(true);

                            }
                        } else {
                            holder.mDisplayMessage.setBackgroundColor(Color.GREEN);
                            holder.mDisplayMessage.setTextColor(data);
                            mTimeReference.keepSynced(true);

                            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mDisplayMessage.getLayoutParams();
                            params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                            params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                            holder.mDisplayMessage.setLayoutParams(params);
                        }


                        messagesList.add(message);
                        messageList.scrollToPosition(messagesList.size() - 1);

                    }



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

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                }

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

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
        }
        @Override
        public Chat.MessagesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.custom_activity_chat, parent, false);
            return new Chat.MessagesViewHolder(view);
        }
    };
    messageList.setAdapter(firebaseRecyclerAdapter);
    firebaseRecyclerAdapter.startListening();

它获取完整数据而不是仅获取 10 个数据,我不明白为什么。此外,我在任何地方都使用了keepSensed,因为每次我重新启动活动时,整个事情都会再次执行......就像

在此处输入图像描述

然后一秒钟后它加载并正确显示在此处输入图像描述

每次我重新启动活动时都会发生这种情况......所以我怎样才能让活动只重新加载 10 个最新的而不是整个数据

标签: javaandroidfirebasefirebase-realtime-database

解决方案


那么我怎样才能让活动只重新加载 10 个最新的而不是整个数据呢?

您将收到所有消息,而不是仅收到 10 条消息,因为您向适配器传递了一个FirebaseRecyclerOptions对象,该对象包含一个没有限制的查询。

DatabaseReference mFetchingMessages = FirebaseDatabase.getInstance().getReference()
    .child("Messages")
    .child(MessageSenderId)
    .child(MessageRecieverId);

要解决这个问题,您只需要添加这样的.limitToLast(10)调用:

DatabaseReference mFetchingMessages = FirebaseDatabase.getInstance().getReference()
    .child("Messages")
    .child(MessageSenderId)
    .child(MessageRecieverId);
    .limitToLast(10)

推荐阅读