2017-06-13 1 views
0

Fowllowing ce projet friendlychatEst-ce que parseSnapshot a chargé tous les enfants?

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; 
} 

Avez-télécharger des données pour chaque clé? Supposons qu'il soit affiché à l'écran pour 7 éléments de 30 éléments. Cela a été téléchargé tous les 30 articles, mais montre seulement 7 articles ou il est téléchargé tous les 30 articles en une fois.

Répondre

0

La clé pour répondre à cette question se trouve dans ce fragment du code:

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

Le dernier paramètre que vous passez dans l'adaptateur est le DatabaseReference ou Query aux nœuds que les charges de l'adaptateur.

Dans ce cas, le code passe dans un DatabaseReference, ce qui signifie que l'adaptateur chargera tous les noes à cet emplacement.

Si vous voulez charger/afficher moins de nœuds, vous souhaitez passer dans une requête comme ceci:

mFirebaseDatabaseReference.child(MESSAGES_CHILD).limitToLast(10) 

Il n'y a pas intégré dans la logique de charge à la demande dans les adaptateurs FirebaseUI. C'est une demande de fonctionnalité ouverte: https://github.com/firebase/FirebaseUI-Android/issues/17

+0

Merci @Frank Peut-être que je devrais essayer de singleValueListener ajouter à RecyclerView manuellement sans FirebaseUI :) – LIPONEF