#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"/>