【问题标题】:Firebase Database Update profile picture on every post in firebase recyclerviewFirebase recyclerview 中每个帖子的 Firebase 数据库更新个人资料图片
【发布时间】:2020-09-05 12:39:18
【问题描述】:

我有一个使用 FirebaseRecyclerAdapter 构建的包含来自不同用户的帖子的提要。

它工作正常,但是当我更改用户的个人资料图片时,我希望该用户所有帖子中的个人资料图片也随之更改。

目前它只显示创建帖子时存在的个人资料图片。

代码如下:

当我点击上传按钮时,我调用了chooseImage:

private void chooseImage() {
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
        startActivityForResult(intent, PICK_IMAGE_REQUEST);
    }


@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK
                && data != null && data.getData() != null) {
            imageUri = data.getData();
            uploadImage();
        }
    }

private void uploadImage() {
        if (imageUri != null) {

            StorageReference fileReference = storageReference
                    .child(FirebaseAuth.getInstance().getCurrentUser().getUid() + "." + getImageExtension(imageUri));
            fileReference.putFile(imageUri)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Handler handler = new Handler();
                            Picasso.with(getContext()).load(imageUri).into(imgProfile);
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    progressBar.setProgress(0);
                                    progressBar.setVisibility(View.GONE);

                                }
                            }, 1000);
                            Toast.makeText(getActivity(), "Image changed successfully", Toast.LENGTH_LONG).show();
                            databaseReference.child("profilePic").setValue(taskSnapshot.getStorage().getDownloadUrl().toString());
                            UserProfileChangeRequest profileChangeRequest = new UserProfileChangeRequest.Builder()
                                    .setPhotoUri(imageUri)
                                    .build();
                            user.updateProfile(profileChangeRequest);

                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(getActivity(), e.getMessage(), Toast.LENGTH_SHORT).show();

                        }
                    })
                    .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onProgress(@NonNull UploadTask.TaskSnapshot taskSnapshot) {
                            double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
                            progressBar.setVisibility(View.VISIBLE);
                            progressBar.setProgress((int) progress);
                        }
                    });
        } else {
            Toast.makeText(this.getContext(), "No image selected", Toast.LENGTH_SHORT).show();
        }


    }

这就是我添加帖子的方式:

btnPostComm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String story = et.getText().toString();
                String title = et2.getText().toString();
                String key = refference.push().getKey();
                String name = user.getDisplayName();
                String uri = user.getPhotoUrl().toString();
                CommModel model = new CommModel(
                        story,
                        title,
                        name,
                        uri
                );

                refference
                        .child(key)
                        .setValue(model);
            }
        });

这是我的模型类:

public class CommModel {
    private String story;
    private String title;
    private String name;
    private String uri;

    public CommModel(){}

    public CommModel(String story, String title, String name, String uri) {
        this.story = story;
        this.title = title;
        this.name = name;
        this.uri = uri;
    }

    public String getStory() {
        return story;
    }

    public void setStory(String story) {
        this.story = story;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getUri() {
        return uri;
    }

    public void setUri(String uri) {
        this.uri = uri;
    }
}

这是 ViewHolder:

public class PostsViewHolder extends RecyclerView.ViewHolder {

    public TextView txtStory;
    public TextView txtTitle;
    public TextView txtName;
    public CircularImageView proImage;

    public QNAViewHolder(@NonNull View itemView) {
        super(itemView);
        txtStory = itemView.findViewById(R.id.txtStory);
        txtTitle = itemView.findViewById(R.id.txtTitle);
        txtName = itemView.findViewById(R.id.txtName1);
        proImage = itemView.findViewById(R.id.profile3);
    }
}

这是 Fragment 中承载 RecyclerView 的 Adapter:

public void showPosts() {
        FirebaseRecyclerOptions options = new FirebaseRecyclerOptions.Builder<CommModel>()
                .setQuery(ref, CommModel.class)
                .build();
        adpt = new FirebaseRecyclerAdapter<CommModel, PostsViewHolder>(options) {

            @Override
            protected void onBindViewHolder(@NonNull PostsViewHolder holder, int position, @NonNull CommModel model) {
                holder.txtStory.setText(model.getStory());
                holder.txtTitle.setText(model.getTitle());
                holder.txtName.setText(model.getName());
                Glide.with(Posts.this).load(model.getUri()).into(holder.proImage);

            }

            @Override
            public int getItemCount() {
                return super.getItemCount();
            }

            @Override
            public void onDataChanged() {
                recyclerView.removeAllViews();
                super.onDataChanged();
            }

            @NonNull
            @Override
            public CommModel getItem(int position) {
                return super.getItem(getItemCount() - 1 - position);
            }

            @NonNull
            @Override
            public PostsViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.qna_feed, parent, false);
                return new PostsViewHolder(view);
            }
        };
        adpt.startListening();
        adpt.notifyDataSetChanged();
        recyclerView.setAdapter(adpt);
    }

当用户更改个人资料图片时,我如何更新用户每条帖子上的图片?

非常感谢!

【问题讨论】:

    标签: android firebase firebase-realtime-database firebase-storage android-recyclerview


    【解决方案1】:

    如果您想这样做,您必须更改 CommModel 类。您需要添加另一个属性,例如userUid。

    private String story;
    private String title;
    private String name;
    private String uri;
    private String userUid; //Create new one and getter setter too
    

    之后,在您的showPosts 方法中,您可以调用用户的属性并获取他的头像。

    holder.txtStory.setText(model.getStory());
    holder.txtTitle.setText(model.getTitle());
    holder.txtName.setText(model.getName());
    
    final String userUid = model.getUserUid();
    //Call Firebase to get user current profile.
    FirebaseDatabase.getInstance().getReference().child("User").child(userUid).addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
             if(dataSnapshot.exist()){
                final String pictureUrl = dataSnapshot.chilld("profilePic").getValue(String.class);
                 Glide.with(Posts.this).load(pictureUrl).into(holder.proImage);
             }
    
    
          }
    
          @Override
          public void onCancelled(@NonNull DatabaseError databaseError) {
    
          }
    });
    

    【讨论】:

    • 我在 final String profilePic = dataSnapshot.getValue(String.class); 行收到 Failed to convert type java.util.HashMap to String 错误。我的用户数据库如下所示:用户 -> 姓名、电子邮件、电话、profilePic
    • 再提一下。在 uploadImage() 而不是 databaseReference.child("profilePic").setValue(taskSnapshot.getStorage().getDownloadUrl().toString()); 它应该是 databaseReference.child("profilePic").setValue(imageUri.toString());
    • 它适用于 setValue(imageUri.toString()) 。 taskSnapshot.getStorage().getDownloadUrl().toString() 获得了错误的图片链接,并且没有任何内容可以加载到个人资料图片 imageView 中。
    • 我遇到了另一个问题。如果我从其他设备使用该应用程序,则图片未加载,imageViews 为空。有没有办法解决这个问题?
    • @AdrianCosmin 未加载是什么意思? profileUrl 没有价值?
    猜你喜欢
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2018-11-09
    • 2020-05-19
    • 2020-06-25
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多