Запрос к базе данных в FirebaseRecyclerAdapter - PullRequest
0 голосов
/ 06 ноября 2018

Код:

        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, и я не могу понять, почему. Также я повсюду использовал keepSenced, потому что каждый раз, когда я перезапускаю действие, все снова выполняется ... Как

enter image description here

Затем через секунду он загружается и отображается правильно enter image description here

Это происходит каждый раз, когда я перезапускаю упражнение ... Так как я могу сделать упражнение, просто перезагрузив 10 последних из них вместо целых данных

1 Ответ

0 голосов
/ 06 ноября 2018

Так, как я могу заставить действие просто перезагрузить 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...