使用 Glide 和 RecyclerView 上下滚动时图像消失,图像之间的空间增加

Posted

技术标签:

【中文标题】使用 Glide 和 RecyclerView 上下滚动时图像消失,图像之间的空间增加【英文标题】:Images disappear when scrolling up and down and spaces increase between images using Glide and RecyclerView 【发布时间】:2019-01-05 22:51:26 【问题描述】:

我有一个 RecyclerView 来显示我的图像,我使用 Glide 从我在 Firebase 存储中的数据库中加载来自他们的 URLs 的图像。

问题是,当我向上和向下滚动时,图像会重新加载,有时会消失,并且每个图像之间的间距会增加。我怎样才能阻止这种情况?

我的 RecyclerViewAdapter

@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(final myViewHolder holder, int position) 
    final int x = position;
    imageClass = myClassImageList.get(position);
        Glide.with(context)
                .load(imageClass.getName().trim())
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .fitCenter()
                .into(holder.imageView);
        holder.imageView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                new MyAsyncTask().execute(myClassImageList.get(x).getName());

            
        );

以及我如何将我的列表发送到适配器

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

编辑:我通过删除imageLayout中的LinearLayout解决了图片之间的空间问题。

现在我的问题是当我上下滚动时图像会重新加载。

【问题讨论】:

尝试删除磁盘缓存策略 还是同样的问题 为什么没有任何答案:/ 你解决了这个问题吗? 【参考方案1】:

我认为问题在于您将项目添加到列表中的方式。

试着改成

adapter = new ImageRecyclerAdapter(MainActivity.this,list);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));

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);
            adapter.notifyDataSetChanged();
            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();
        
    );


getDownloadUrl() 是否按照它们被调用的顺序返回结果?如果不是,那么很可能图像在列表中以随机顺序加载。

【讨论】:

您在每次随机调用图像时都是对的(为什么会发生这种情况?)。我试过你的答案,它仍然再次加载(可能是因为图像不是可绘制的,或者它们是从Firebase storage 调用的,或者缓存加载的图像有问题,我不知道)。 调用是异步调用,不能保证按调用顺序返回。来自firebase的网址是动态网址吗? 抱歉迟到了。我只是从函数中获取图像的 url。但是直到现在仍然重新加载,直到现在我找不到解决方案【参考方案2】:

由于某些未知原因,将图像视图的可见性设置为 VISIBLE 解决了我的问题。如,在使用 Glide 加载后,写,holder.imageView.visibility = View.VISIBLE

【讨论】:

以上是关于使用 Glide 和 RecyclerView 上下滚动时图像消失,图像之间的空间增加的主要内容,如果未能解决你的问题,请参考以下文章

我一起使用 Glide 和 RecyclerView 但它没有按我的意愿滚动

RecyclerView + Glide 显示结果一团糟

Glide和RecyclerView - 图像搞砸了

缩略图在 RecyclerView (Android) 中保持空白。我正确使用 Glide 吗?

解决RecyclerView瀑布流效果结合Glide使用时图片变形的问题

Android 解决RecyclerView瀑布流效果结合Glide使用时图片变形的问题