回收站视图混合了其项目的内容

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 
  

【讨论】:

以上是关于回收站视图混合了其项目的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何在回收站视图上启用和禁用拖放

封装 ViewHolder 功能以供重用

回收站视图仅在我从房间数据库中删除后重新打开活动时更新

回收站视图项目中未显示分隔线

滚动回收站视图时如何防止项目重复

显示单个项目的回收站视图