Представление Recycler, смешивающее содержимое его элементов - PullRequest
0 голосов
/ 27 мая 2020

Я использую режим ресайклера для загрузки списка сообщений, созданных организацией. Я использовал 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");
                            }
                        });
            }




Может ли кто-нибудь из вас помочь мне в этом?

EDIT

Я немного изменил структуру. Поэтому вместо того, чтобы запускать задачу ссылки на хранилище в адаптере, я сохраняю URL-адрес загрузки в объекте. Таким образом, метод setPostImage имеет только часть Glide.

Итак, метод выглядит следующим образом

public void setPostImage(String downloadURL) {
            postImage.setVisibility(View.VISIBLE);
            Glide.with(context).applyDefaultRequestOptions(placeholder).load(downloadURL).into(postImage);
        }

Тем не менее, я получаю эту проблему. Не знаю как решить

1 Ответ

0 голосов
/ 27 мая 2020
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 
  }
...