使用 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 (Android) 中保持空白。我正确使用 Glide 吗?