解析快照是否加载了所有子项



Fowlling this project 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 个项目。

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

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

传递到适配器的最后一个参数是适配器加载的节点的DatabaseReferenceQuery

在这种情况下,代码传入一个DatabaseReference,这意味着适配器将在该位置加载所有no。

如果要加载/显示更少的节点,可以传入如下查询:

mFirebaseDatabaseReference.child(MESSAGES_CHILD).limitToLast(10)

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

相关内容

  • 没有找到相关文章

最新更新