Я использую Glide для загрузки своих образов из Firebase Storage в RecyclerViewAdapter.
Проблема в том, что иногда загружаются все изображения, но когда я прокручиваю вверх или вниз, изображения исчезают и могут появиться снова, а может и нет. А также, возможно, загрузить только первое изображение. Как я могу этого избежать
Вот мой model.
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
Вот мой MainActivity
imageNames.add(0,"first.jpg");
imageNames.add(1,"second.jpg");
imageNames.add(2,"third.jpg");
imageNames.add(3,"fourth.jpg");
for(int i=0;i<imageNames.size();i++) {
StorageReference ref = storageReference.child("filee/" + imageNames.get(i));
ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
String imageURL = uri.toString();
ImageClass imageClass = new ImageClass();
imageClass.setName(imageURL);
list.add(imageClass);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
Toast.makeText(MainActivity.this, "Downloaded", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Toast.makeText(MainActivity.this, "Not Downloaded", Toast.LENGTH_SHORT).show();
}
});
}
adapter = new ImageRecyclerAdapter(MainActivity.this,list);
recyclerView.setAdapter(adapter);
Вот мой adapter
ublic class ImageRecyclerAdapter extends RecyclerView.Adapter<ImageRecyclerAdapter.myViewHolder> {
List<ImageClass> myClassImageList;
Context context;
public ImageRecyclerAdapter(Context context,List<ImageClass> imageClassArrayList) {
this.myClassImageList = imageClassArrayList;
this.context=context;
}
@Override
public myViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_layout,parent,false);
myViewHolder myViewHolder = new myViewHolder(row);
return myViewHolder;
}
@Override
public void onBindViewHolder(myViewHolder holder, int position) {
ImageClass imageClass = myClassImageList.get(position);
if (myClassImageList.get(position).getName()!=null) {
Glide.with(context).load(imageClass.getName()).into(holder.imageView);
}
else {
Glide.clear(holder.imageView);
holder.imageView.setImageDrawable(null);
}
}
//....
@MohammedFarhan Проблема с прокруткой решена спасибо. Теперь по-прежнему загружается только одно изображение и просто пустые места для остальных изображений.
@MohammedFarhan И я попытался вытащить inearlayoutmanager из цикла for, изображения не появлялись. Я знаю, что addOnSuccessListener асинхронный, но я не могу справиться с этой проблемой.
@MohammedFarhan Я использовал Logs, чтобы узнать, что именно происходит. Я обнаружил, что URLs прямо в адаптере и в моем методе. Но я не знаю, почему иногда появляются все изображения, а иногда только одно, а другие нет.
также перекрестно проверьте, находятся ли ваши изображения с тем же именем и расширением в хранилище firebase в дочернем каталоге filee. А также проверьте, большой ли размер изображения, потому что, если размер изображения большой, иногда требуется несколько секунд-минут, чтобы загрузить все изображения по одному.
Да, у них то же имя и расширение. И все изображения иногда появляются, что означает, что размер изображений не является проблемой, я думаю.
Хорошо, попробуйте добавить метод trim() на getName() внутри if condition, а также в glide.load getName().trim()
@MohammedFarhan Я думаю, это работает. Но когда загружается последнее изображение, все изображения появляются в области действия последнего изображения.
@MohammedFarhan Я нашел проблему. Это было в моем макете: /. Спасибо за помощь . Но когда я прокручиваю вверх и вниз, изображения перезагружаются. Как перестать загружать изображения при прокрутке?
Хорошо, попробуйте добавить load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).into()
попробуйте добавить все свои объекты
ImageClassв список, как вы это делаете сейчас внутриfor loop, но не устанавливайте адаптер для recyclerview внутри цикла for, вместо этого установите адаптер recyclerview и его linearlayoutmanager вне цикла for, когда вы закончите получение списка вашегоImageClass.addOnSuccessListener- этоasync. Вы должны установить адаптер вне методов firebase.