Android Recycler Просмотр дублирующих изображений из Firebase - PullRequest
0 голосов
/ 27 июня 2018

Я пишу приложение для группового чата в Android Studio и использую Firebase в качестве бэкэнда. Я пытаюсь разрешить пользователям публиковать изображения, однако каждый раз, когда я отправляю изображение в хранилище Firebase и извлекаю его для отправки в представление переработчика с помощью Glide, оно дублируется в представлении переработчика. Я подтвердил, что изображение в хранилище Firebase НЕ дублирует, оно просто в представлении переработчика в самом приложении. Я боролся с этой проблемой в течение нескольких дней и не могу понять, почему она дублируется.

Вот мой код:

Загружает и получает URL изображения в Firebase

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");

                        }
                    }
                 }
            });
}

Адаптер Recycler View

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

Буду признателен за любую помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...