【问题标题】:Android/Firebase: Glide not working inside one of my fragmentsAndroid/Firebase:Glide 在我的一个片段中不起作用
【发布时间】:2019-08-06 01:02:43
【问题描述】:

所以我有一个包含三个片段的应用程序,我可以使用选项卡进行切换。选项卡/片段之一是“Feed”,其中包含来自 firebase 数据库的用户图片。图片存储为 Firebase 存储项目的链接。 Glide 在这个片段中工作得非常好。我现在正在尝试使用另一个 RecyclerView 在另一个选项卡/片段中添加一个画廊功能,这与提要选项卡几乎相同,但它不起作用。

这是我的画廊片段中的 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 有关,但我就是想不通。任何帮助将不胜感激。我一直在努力解决这个问题。

【问题讨论】:

  • 检查您使用的上下文 - holder.imageView.getContext()。如果为 null,则使用持有者上下文或片段上下文。
  • 它不为空。它有价值。
  • 你错过了调用 notifyDatasetChanged 方法。

标签: java android firebase fragment android-glide


【解决方案1】:

尝试将上下文从您的片段传递到您的适配器并使用它

替换这个Glide.with(holder.imageView.getContext()).load(images.get(position)).into(holder.imageView);

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

【讨论】:

    【解决方案2】:

    你为 Glide 编写了错误的代码。

    在适配器中,您使用此代码加载图像

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

    在 Fragment 中,您使用此代码加载图像

     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);
    

    希望对你有帮助!

    谢谢。

    【讨论】:

      【解决方案3】:

      对于使用 Glide 加载图像,你能试试这个从 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】:

        我遇到了同样的问题,结果证明清单文件中没有 Internet 权限。添加以下行解决了问题:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-04
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          • 2014-03-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多