回收站视图混合了其项目的内容
Posted
技术标签:
【中文标题】回收站视图混合了其项目的内容【英文标题】:Recycler view mixing up the contents of its items 【发布时间】:2020-09-14 18:10:25 【问题描述】:我正在使用回收站视图来加载由和组织发布的帖子列表。我使用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);
我仍然遇到这个问题。不知道怎么解决
【问题讨论】:
这不是一个好主意,从存储引用中获取 URL 同时对视图进行错误处理。您可以将可能的项目 URL 列表传递给适配器本身。这样可以快速获取可以传递给 Glide 加载的图像 url。 有什么问题? @DurgaM 我做到了。我将 url 存储到适配器的列表中,但我仍然是那个错误。 @AlexMamo 回收站视图的内容搞混了。 好的,但问题是什么? 【参考方案1】: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
【讨论】:
以上是关于回收站视图混合了其项目的内容的主要内容,如果未能解决你的问题,请参考以下文章