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