我想使用Firebase Storage
从RecyclerView
下载图像。仅出现最后一张图像,其他图像在那里,但不出现在屏幕上(用空格代替图像)。
我确保其余图像分别显示。
这是我的model class
。
public class ImageClass {
private Bitmap bitmap;
public ImageClass(Bitmap bitmap) {
this.bitmap = bitmap;
}
public Bitmap getBitmap() {
return bitmap;
}
public void setBitmap(Bitmap bitmap) {
this.bitmap = bitmap;
}
}
我的adapter
...
@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(myViewHolder holder, int position) {
ImageClass imageClass = myClassImageList.get(position);
holder.imageView.setImageBitmap(imageClass.getBitmap());
}
...
我的Main Activity
imageNames.add(0,"ha.jpg");
imageNames.add(1,"ahmed.jpg");
getData();
adapter = new ImageRecyclerAdapter(imageClassList);
recyclerView.setAdapter(adapter);
}
public void getData() {
for(int i=0;i<imageNames.size();i++) {
StorageReference ref = storageReference.child("filee/"+imageNames.get(i));
try {
localFile = File.createTempFile("Images", "jpg");
} catch(IOException e) {
}
ref.getFile(localFile).addOnSuccessListener(new OnSuccessListener< FileDownloadTask.TaskSnapshot >() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath());
ImageClass imageClass = new ImageClass(bitmap);
imageClass.setBitmap(bitmap);
imageClassList.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 e) {
Toast.makeText(MainActivity.this, "NotDownloaded", Toast.LENGTH_SHORT).show();
}
});
}
}
答案 0 :(得分:3)
也许我会在Service中下载图像,但是在谈论当前的实现时,请记住getFile异步运行,而且,在哪里声明了位图?从我可以看到,一遍又一遍地覆盖了Object,然后将该对象的引用作为参数传递给ImageClass对象。
一个选择可能是首先创建ImageClass集合(例如Arraylist),循环它们并保存位图。
所以您的ImageClass类似于:
public class ImageClass {
private Bitmap bitmap;
//...
private String name;
public void setName(String name){
this.name=name;
}
public String getName(){
return this.name;
}
}
然后是这样:
for(int i=0;i<images.size();i++) {
ImageClass image = images.get(i);
StorageReference ref = storageReference.child("filee/"+image.getName());
//https://firebase.google.com/docs/storage/android/download-files#download_in_memory
ref.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
image.setBitMap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length));
recyclerView.getAdapter().notifyItemChanged(images.indexOf(image));
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
Toast.makeText(MainActivity.this, "NotDownloaded", Toast.LENGTH_SHORT).show(); //would not recomend this either
}
});
}
请确保签出Firebase Storage快速入门:https://github.com/firebase/quickstart-android/tree/master/storage
答案 1 :(得分:0)
我的猜测是您的下载方法无法显示大图像。如果您使用的是Firebase,则应利用它提供的所有工具,并实施Firebase UI已提供的更简单有效的解决方案。基本上,它使用一个名为Glide的库,大大简化了您要实现的目标。