2017-06-13 67 views
0

Fowllowing这个项目friendlychatparseSnapshot是否加载所有孩子?

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

回答

0

关键要回答这个问题是在代码中的这个片段:

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

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

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

如果要加载/显示更少的节点,你会传递这样的查询:

mFirebaseDatabaseReference.child(MESSAGES_CHILD).limitToLast(10) 

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

+0

谢谢@Frank也许我应该尝试singleValueListener添加到RecyclerView手动没有FirebaseUI :) – LIPONEF

相关问题