我正在使用一个回收器视图来加载一个由和组织制作的帖子列表。我使用firestore作为后端。为了加载图像,我首先从存储引用中获取下载Url,然后使用Glide将图像加载到图像视图中。我面临的问题是,由于对存储引用的调用是异步的,当它从服务器获得下载uri时,适配器在OnBindviewHolder中的位置已经改变,因此图像被混淆。
我已经提供了OnBindViewHolder代码和获取下载url的方法
@Override
public void onBindViewHolder(@NonNull final studentFavouriteUniversityPosts.MyViewHolder holder, int position) {
if(postsList.get(holder.getAdapterPosition()).getImageUrl()!=null &&
!postsList.get(holder.getAdapterPosition()).getImageUrl().isEmpty()){
holder.setPostImage(holder.getAdapterPosition());
}
}
public void setPostImage(int position) {
postImage.setVisibility(View.VISIBLE);
placeholder.placeholder(R.color.white);
//Getting the download uri from the Fire store storage and displaying it using glide.
storageReference.child(postsList.get(position).getImageUrl())
.getDownloadUrl()
.addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Log.d("URI",uri.toString());
Glide.with(context).applyDefaultRequestOptions(placeholder).load(uri).into(postImage);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("ERROR","err loading image file");
}
});
}
你们谁能帮我解决这个问题?
编辑
我稍微改变了一下结构。因此,我没有在适配器中运行存储引用任务,而是将下载url存储在对象中。因此,setPostImage方法只有Glide部分。
因此,该方法如下所示
public void setPostImage(String downloadURL) {
postImage.setVisibility(View.VISIBLE);
Glide.with(context).applyDefaultRequestOptions(placeholder).load(downloadURL).into(postImage);
}
尽管如此,我还是得到了这个问题。我不知道该怎么解决它
发布于 2020-05-27 16:30:57
First get the list of urls from firestore from the activity or fragment where you are
setting the adapter
1. public void getImages() { storageReference.child("the child name")
.getDownloadUrl()
.addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Log.d("URI",uri.toString());
adapter.imagesRetrieved();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d("ERROR","err loading image file");
}
});
}
2. Then inside on success listener pass the group of values to the adapter method from the success listener and define the method inside the adapter
public void imagesRetreived() {
notifyDataChanged(images);
}
private void notifyDataChanged(Images images) {
this.images = images;
notifydatasetchanged(); //this one is recycler view inbuilt method
}
https://stackoverflow.com/questions/62047572
复制