FirebaseRecyclerAdapterで画像を表示させたい
Firebaseのチャットのサンプルプログラムを利用し、勉強していますが、
チャット画面で画像の表示ができません。
https://codelabs.developers.google.com/codelabs/firebase-android/index.html
・参考 web版
https://codelabs.developers.google.com/codelabs/firebase-web/index.html
FirebaseRecyclerAdapter
で画像をセットしようとしています。
viewHolder
に画像をセットしているのですが、画像のないviewHolder
にも
画像が表示されてしまいます。
mFirebaseAdapter = new FirebaseRecyclerAdapter<FriendlyMessage,
MessageViewHolder>(
FriendlyMessage.class,
R.layout.item_message,
MessageViewHolder.class,
mFirebaseDatabaseReference.child(MESSAGES_CHILD)) {
@Override
protected void populateViewHolder(final MessageViewHolder viewHolder,
final FriendlyMessage friendlyMessage, final int position) {
mProgressBar.setVisibility(ProgressBar.INVISIBLE);
viewHolder.messageTextView.setText(friendlyMessage.getText());
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.getImageUrl() != null) {
mFirebaseStorageReference = mFirebaseStorage.getReferenceFromUrl(friendlyMessage.getImageUrl());
mFirebaseStorageReference.getMetadata().addOnSuccessListener( new OnSuccessListener<StorageMetadata>() {
@Override
public void onSuccess( StorageMetadata storageMetadata ) {
mDownloadUri = storageMetadata.getDownloadUrl();
Glide.with(MainActivity.this)
.load(mDownloadUri.toString())
.into(viewHolder.messageImageView);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
}
画像のURLは、DBに入っていないため、mDownloadUri = storageMetadata.getDownloadUrl();
でURLを取得しています。
ちなみに、
https://firebase.google.com/docs/storage/android/file-metadata#get_file_metadata
にある
// Alternatively you can get the metadata with
StorageMetadata storageMetadata = forestRef.getMetadata().getResult();
では、metadataが取得できないため、addOnSuccessListener
で取得しています。