parseSnapshot加载了所有孩子吗?

时间:2017-06-13 15:52:35

标签: android firebase firebase-realtime-database firebaseui

此项目friendlychat

 mMessageRecyclerView = (RecyclerView) findViewById(R.id.messageRecyclerView);
    mLinearLayoutManager = new LinearLayoutManager(this);
    mLinearLayoutManager.setStackFromEnd(true);

    mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference();
    mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder>(
            FriendlyMessage.class,
            R.layout.item_message,
            MessageViewHolder.class,
            mFirebaseDatabaseReference.child(MESSAGES_CHILD)) {

        @Override
        protected FriendlyMessage parseSnapshot(DataSnapshot snapshot) {
            FriendlyMessage friendlyMessage = super.parseSnapshot(snapshot);
            if (friendlyMessage != null) {
                friendlyMessage.setId(snapshot.getKey());
                Log.d("Key", snapshot.getKey());
            }
            return friendlyMessage;
        }

        @Override
        protected void populateViewHolder(final MessageViewHolder viewHolder,
                                          FriendlyMessage friendlyMessage, int position) {
            mProgressBar.setVisibility(ProgressBar.INVISIBLE);
            if (friendlyMessage.getText() != null) {
                viewHolder.messageTextView.setText(friendlyMessage.getText());
                viewHolder.messageTextView.setVisibility(TextView.VISIBLE);
                viewHolder.messageImageView.setVisibility(ImageView.GONE);
            } else {
                String imageUrl = friendlyMessage.getImageUrl();
                if (imageUrl.startsWith("gs://")) {
                    StorageReference storageReference = FirebaseStorage.getInstance()
                            .getReferenceFromUrl(imageUrl);
                    storageReference.getDownloadUrl().addOnCompleteListener(
                            new OnCompleteListener<Uri>() {
                        @Override
                        public void onComplete(@NonNull Task<Uri> task) {
                            if (task.isSuccessful()) {
                                String downloadUrl = task.getResult().toString();
                                Glide.with(viewHolder.messageImageView.getContext())
                                        .load(downloadUrl)
                                        .into(viewHolder.messageImageView);
                            } else {
                                Log.w(TAG, "Getting download url was not successful.",
                                        task.getException());
                            }
                        }
                    });
                } else {
                    Glide.with(viewHolder.messageImageView.getContext())
                            .load(friendlyMessage.getImageUrl())
                            .into(viewHolder.messageImageView);
                }
                viewHolder.messageImageView.setVisibility(ImageView.VISIBLE);
                viewHolder.messageTextView.setVisibility(TextView.GONE);
            }


            viewHolder.messengerTextView.setText(friendlyMessage.getName());
            if (friendlyMessage.getPhotoUrl() == null) {
                viewHolder.messengerImageView.setImageDrawable(ContextCompat.getDrawable(MainActivity.this,
                        R.drawable.ic_account_circle_black_36dp));
            } else {
                Glide.with(MainActivity.this)
                        .load(friendlyMessage.getPhotoUrl())
                        .into(viewHolder.messengerImageView);
            }

            if (friendlyMessage.getText() != null) {
                // write this message to the on-device index
                FirebaseAppIndex.getInstance().update(getMessageIndexable(friendlyMessage));
            }

            // log a view action on it
            FirebaseUserActions.getInstance().end(getMessageViewAction(friendlyMessage));
        }
    };

    mFirebaseAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onItemRangeInserted(int positionStart, int itemCount) {
            super.onItemRangeInserted(positionStart, itemCount);
            int friendlyMessageCount = mFirebaseAdapter.getItemCount();
            int lastVisiblePosition = mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
            // If the recycler view is initially being loaded or the user is at the bottom of the list, scroll
            // to the bottom of the list to show the newly added message.
            if (lastVisiblePosition == -1 ||
                    (positionStart >= (friendlyMessageCount - 1) && lastVisiblePosition == (positionStart - 1))) {
                mMessageRecyclerView.scrollToPosition(positionStart);
            }
        }
    });

    mMessageRecyclerView.setLayoutManager(mLinearLayoutManager);
    mMessageRecyclerView.setAdapter(mFirebaseAdapter);

}

private Action getMessageViewAction(FriendlyMessage friendlyMessage) {
    return new Action.Builder(Action.Builder.VIEW_ACTION)
            .setObject(friendlyMessage.getName(), MESSAGE_URL.concat(friendlyMessage.getId()))
            .setMetadata(new Action.Metadata.Builder().setUpload(false))
            .build();
}

private Indexable getMessageIndexable(FriendlyMessage friendlyMessage) {
    PersonBuilder sender = Indexables.personBuilder()
            .setIsSelf(mUsername.equals(friendlyMessage.getName()))
            .setName(friendlyMessage.getName())
            .setUrl(MESSAGE_URL.concat(friendlyMessage.getId() + "/sender"));

    PersonBuilder recipient = Indexables.personBuilder()
            .setName(mUsername)
            .setUrl(MESSAGE_URL.concat(friendlyMessage.getId() + "/recipient"));

    Indexable messageToIndex = Indexables.messageBuilder()
            .setName(friendlyMessage.getText())
            .setUrl(MESSAGE_URL.concat(friendlyMessage.getId()))
            .setSender(sender)
            .setRecipient(recipient)
            .build();

    return messageToIndex;
}

每个密钥的数据是否单独下载?假设它在屏幕上显示30个项目中的7个项目。这已经下载了所有30个项目,但只显示了7个项目,或者它一次性下载了所有30个项目。

1 个答案:

答案 0 :(得分:0)

回答这个问题的关键在于代码片段:

expect_any_instance_of(RemoteAPIClassObject).to receive(:makeCall).and_return(some_stubbed_object)

传递给适配器的最后一个参数是适配器加载的节点的mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage, MessageViewHolder>( FriendlyMessage.class, R.layout.item_message, MessageViewHolder.class, mFirebaseDatabaseReference.child(MESSAGES_CHILD)) { DatabaseReference

在这种情况下,代码传递Query,这意味着适配器将加载该位置的所有noes。

如果您想加载/显示更少的节点,您可以传递这样的查询:

DatabaseReference

FirebaseUI适配器中没有内置的按需加载逻辑。这是一个开放的功能请求:https://github.com/firebase/FirebaseUI-Android/issues/17