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

问题描述 投票:0回答:1

我正在使用回收站视图来加载由组织发布的帖子列表。我已经使用Firestore作为后端。为了加载图像,我首先要从存储参考中获取下载网址,然后使用Glide将图像加载到图像视图中。我面临的问题是,由于对存储引用的调用是异步的,因此当它从服务器获取下载uri时,适配器在OnBindviewHolder中的位置已经更改,因此图像变得混乱。

我提供了OnBindViewHolder代码和获取下载网址的方法

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




你们中的任何人都可以帮助我吗?

java android firebase android-asynctask firebase-storage
1个回答
0
投票
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 
  }
© www.soinside.com 2019 - 2024. All rights reserved.