Android RecyclerView从Firebase复制图像

时间:2018-06-27 02:01:10

标签: android firebase android-recyclerview

我正在Android Studio中编写一个小型的群聊应用程序,并使用Firebase作为后端。我试图允许用户发布图像,但是每次我将图像发送到Firebase存储并检索它以便使用Glide发布到回收器视图时,它都会在回收器视图中复制。我已经确认Firebase存储中的映像没有重复,只是在应用程序本身的回收者视图上。我已经为这个问题苦苦挣扎了好几天了,我一生都找不到重复它的原因。

这是我的代码:

上传和检索Firebase中的图像URL

public void uploadImage(final Uri filePath) {

    if (filePath != null) {
        final String pathToImage = "chatImages/" + user.getUid()+"/"+ UUID.randomUUID();

        StorageReference storeRef = storageReference.child(pathToImage);
        UploadTask uploadTask = storeRef.putFile(filePath);

        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e(TAG, "Upload Failed");
            }
        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                Log.e(TAG, "Upload Successful");
                //now that the image has been uploaded, send to chat
                storageReference.child(pathToImage).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        //adds photo, username and message to the arraylists\
                        imagePath = uri.toString();
                        Log.e(TAG, "done");
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.e(TAG, "Failed to Retrieve Image Message");
                    }
                });
            }
        });
    }
}

将图像和其他帖子信息添加到回收者视图

db.collection("chats").document("0fv4XvLpi8dWivyohQbk").collection("chatMessages")
            .orderBy("TimeStamp")
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.e(TAG, "Listen Failed", e);
                        return;
                    }
                    //temporay arraylists
                    final ArrayList<String> uIdAL = new ArrayList<>();
                    //gets any updates
                    for (DocumentChange newdoc : queryDocumentSnapshots.getDocumentChanges()) {
                        if (newdoc.getType() == DocumentChange.Type.ADDED) {
                            Log.e(TAG, "new message" + newdoc.getDocument().getData());

                            //saves userIDs for later use in getting profile pics
                            uIdAL.add((String) newdoc.getDocument().getData().get("userID"));

                            //temporary profile picture
                            if(chatPhotoUrl != null && ((String) newdoc.getDocument().getData().get("userID")).equals(user.getUid()))
                            {
                                messageAvatars.add(chatPhotoUrl.toString());
                            }
                            else
                            {
                                messageAvatars.add("https://pictures.digitalrev.com/image/upload/v1454493563/gzev2fhfpoizg3bpozjr.jpg");
                            }

                            //get usernames and messages
                            userNames.add((String) newdoc.getDocument().getData().get("userName"));
                            messages.add((String) newdoc.getDocument().getData().get("message"));
                            imageMessages.add((String) newdoc.getDocument().getData().get("imageMessage"));

                            //add to recycler view
                            adapter.notifyItemInserted(userNames.size());
                            rv.scrollToPosition(userNames.size() - 1);

                            Log.e(TAG, "here");

                        }
                    }
                 }
            });
}

回收站视图适配器

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder>{
private static final String TAG = "RecyclerViewAdapter";
private ArrayList<String> messageAvatars = new ArrayList<>();
private ArrayList<String> userNames = new ArrayList<>();
private ArrayList<String> messages = new ArrayList<>();
private ArrayList<String> imageMessages = new ArrayList<>();
private Context context;

public RecyclerViewAdapter(ArrayList<String> messageAvatars, ArrayList<String> userNames, ArrayList<String> messages, ArrayList<String> imageMessages, Context context) {
    this.messageAvatars = messageAvatars;
    this.userNames = userNames;
    this.messages = messages;
    this.imageMessages = imageMessages;
    this.context = context;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerviewitem,parent, false);
    ViewHolder viewholder = new ViewHolder(view);
    return viewholder;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Log.e(TAG, "onBindViewHolder: called");
    //sets the fields in the recyclerview item
    Glide.with(context).asBitmap().load(messageAvatars.get(position)).into(holder.messageImage);

    holder.userName.setText(userNames.get(position));
    holder.messageText.setText(messages.get(position));

    Glide.with(context).asBitmap().load(imageMessages.get(position)).into(holder.imageMessage);
    //triggers if the recyclerview item is clicked
    holder.parentLayout.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view)
        {
            Log.e(TAG, "onClick: clicked");
        }
    });

}

@Override
public int getItemCount() {
    return userNames.size();
}
@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
    return position;
}

public class ViewHolder extends RecyclerView.ViewHolder{
    CircleImageView messageImage;
    TextView userName;
    TextView messageText;
    ImageView imageMessage;
    ConstraintLayout parentLayout;

    public ViewHolder(View itemView) {
        super(itemView);
        messageImage = itemView.findViewById(R.id.chatImageView);
        userName = itemView.findViewById(R.id.usernametextView);
        messageText = itemView.findViewById(R.id.messagetextView);
        imageMessage = itemView.findViewById(R.id.imageView);
        parentLayout = itemView.findViewById(R.id.parentlayout);
    }
}

我们将不胜感激!

0 个答案:

没有答案