Android / Firebase: Glide не работает внутри одного из моих фрагментов

#java #android #firebase #fragment #android-glide

#java #Android #firebase #фрагмент #android-glide

Вопрос:

Итак, у меня есть приложение с тремя фрагментами, которые я могу переключать с помощью вкладок. Одна из вкладок / фрагментов — это «Лента», которая содержит изображения пользователей из базы данных firebase. Изображения хранятся как ссылки на элементы хранилища Firebase. Glide отлично работает в этом фрагменте. Сейчас я пытаюсь добавить функцию галереи на другой вкладке / фрагменте, используя другой RecyclerView, который почти идентичен вкладке feed, но это не работает.

Вот мой onCreateView в моем фрагменте галереи:

     @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        view = inflater.inflate(R.layout.gallery_fragment, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.galleryRecyclerView);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);

        // This list is populated by a Firebase childEvent listener 
        imageIDs = new ArrayList<>();

        adapter = new MyGalleryAdapter2(imageIDs);
        recyclerView.setAdapter(adapter);

        // Method that retrieves the images from the Firebase DB (works)
        getGalleryDB();

        return view;
    }
  

Я отладил и убедился, что ArrayList заполнен рабочими ссылками на изображения (их 16).

Вот мой класс GalleryAdapter:

 public class MyGalleryAdapter2 extends RecyclerView.Adapter<MyGalleryAdapter2.MyViewHolder> {

    List<String> images;

    public static class MyViewHolder extends RecyclerView.ViewHolder {   
            public ImageView imageView;   
            public MyViewHolder(View v) {
                super(v);
                imageView = (ImageView)v.findViewById(R.id.gallery_image);
            }
    }

    public MyGalleryAdapter2(List<String> images){
        this.images = images;
    }

    @Override
    public void onBindViewHolder(MyGalleryAdapter2.MyViewHolder holder, final int position) {
        // This doesn't work
        Glide.with(holder.imageView.getContext()).load(images.get(position)).into(holder.imageView);
       // holder.imageView.setImageResource(R.drawable.gallery_icon); This works for some reason
    }

    @Override
    public MyGalleryAdapter2.MyViewHolder onCreateViewHolder(ViewGroup parent,
                                                     int viewType) {

        View v = (View) LayoutInflater.from(parent.getContext())
                .inflate(R.layout.gallery_item, parent, false);

        MyGalleryAdapter2.MyViewHolder vh = new MyGalleryAdapter2.MyViewHolder(v);

        return vh;
    }

    @Override
    public int getItemCount(){
        return images.size();
    }
}
  

В методе «onBindViewHolder» glide по какой-то причине не загружает изображения в ImageView. Я пробовал отладку, и ссылки на этом этапе верны. Я также попытался просто установить ресурс изображения на локальное изображение, и RecyclerView заполняется 16 из этих изображений (количество изображений, извлеченных из базы данных).

Эта проблема на 100% как-то связана с Glide, но я просто не могу в этом разобраться. Буду признателен за любую помощь. Я рвал на себе волосы из-за этого.

Комментарии:

1. Проверьте используемый вами контекст — holder.ImageView.getContext(). Если null, то используйте контекст держателя или контекст фрагмента.

2. Это не значение null. У него есть значения.

3. Вы пропустили вызов метода notifyDataSetChanged.

Ответ №1:

Вы пишете неправильный код для Glide.

В адаптере вы загружаете изображение, используя этот код

 Glide.with(context).load(images.get(position)).into(holder.imageView);
  

Во фрагменте вы загружаете изображение, используя этот код

  Glide
    .with(myFragment)
    .load(url)
    .centerCrop()
    .into(myImageView);
  

Загрузите изображение Firebase, используя этот код

  FirebaseStorage u = FirebaseStorage.getInstance().getReference().child("photos/"   auth);
            Glide.with(getApplicationContext())
                    .using(new FirebaseImageLoader())
                    .load(u)
                    .into(ivm);
  

Я надеюсь, что это может вам помочь!

Спасибо.

Ответ №2:

Попробуйте передать контекст из вашего фрагмента в ваш адаптер и используйте это

Замените это Glide.with(holder.imageView.getContext()).load(images.get(position)).into(holder.imageView);

с

 Glide.with(context).load(images.get(position)).into(holder.imageView);
  

Ответ №3:

Для загрузки изображений с помощью Glide, не могли бы вы, пожалуйста, попробовать это, чтобы загрузить bitmap из firebase

  Glide.with(context)
      .load(images.get(position))
      .into(
          new CustomTarget<Drawable>() {
            @Override
            public void onResourceReady(
                @NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
              holder.imageView.set(resource);
            }

            @Override
            public void onLoadCleared(@Nullable Drawable placeholder) {
             //set placeholder if any
            }
          });
  

Ответ №4:

У меня была идентичная проблема, и оказалось, что в файле манифеста не было разрешения на доступ в Интернет. Добавление следующей строки решило проблему:

 <uses-permission android:name="android.permission.INTERNET"/>