Загрузка изображений из хранилища Firebase с помощью Glide в RecyclerViewAdapter

Я использую 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);

    }
}

//....

попробуйте добавить все свои объекты ImageClass в список, как вы это делаете сейчас внутри for loop, но не устанавливайте адаптер для recyclerview внутри цикла for, вместо этого установите адаптер recyclerview и его linearlayoutmanager вне цикла for, когда вы закончите получение списка вашего ImageClass. addOnSuccessListener - это async. Вы должны установить адаптер вне методов firebase.

Mohammed Farhan 25.07.2018 13:55

@MohammedFarhan Проблема с прокруткой решена спасибо. Теперь по-прежнему загружается только одно изображение и просто пустые места для остальных изображений.

Ahmed 25.07.2018 14:06

@MohammedFarhan И я попытался вытащить inearlayoutmanager из цикла for, изображения не появлялись. Я знаю, что addOnSuccessListener асинхронный, но я не могу справиться с этой проблемой.

Ahmed 25.07.2018 14:15

@MohammedFarhan Я использовал Logs, чтобы узнать, что именно происходит. Я обнаружил, что URLs прямо в адаптере и в моем методе. Но я не знаю, почему иногда появляются все изображения, а иногда только одно, а другие нет.

Ahmed 25.07.2018 14:49

также перекрестно проверьте, находятся ли ваши изображения с тем же именем и расширением в хранилище firebase в дочернем каталоге filee. А также проверьте, большой ли размер изображения, потому что, если размер изображения большой, иногда требуется несколько секунд-минут, чтобы загрузить все изображения по одному.

Mohammed Farhan 25.07.2018 14:54

Да, у них то же имя и расширение. И все изображения иногда появляются, что означает, что размер изображений не является проблемой, я думаю.

Ahmed 25.07.2018 14:59

Хорошо, попробуйте добавить метод trim() на getName() внутри if condition, а также в glide.load getName().trim()

Mohammed Farhan 25.07.2018 15:05

@MohammedFarhan Я думаю, это работает. Но когда загружается последнее изображение, все изображения появляются в области действия последнего изображения.

Ahmed 25.07.2018 15:16

@MohammedFarhan Я нашел проблему. Это было в моем макете: /. Спасибо за помощь . Но когда я прокручиваю вверх и вниз, изображения перезагружаются. Как перестать загружать изображения при прокрутке?

Ahmed 25.07.2018 16:28

Хорошо, попробуйте добавить load(url).diskCacheStrategy(DiskCacheStrategy.SOURCE).into()

Mohammed Farhan 25.07.2018 17:47
1
10
439
0

Другие вопросы по теме