仅当我使用RecyclerViewAdapter从Firebase Storage下载图像时才显示最后一个图像

时间:2018-07-24 13:24:41

标签: android firebase android-recyclerview firebase-storage

我想使用Firebase StorageRecyclerView下载图像。仅出现最后一张图像,其他图像在那里,但不出现在屏幕上(用空格代替图像)。

我确保其余图像分别显示。

这是我的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(); 
            }
        });
    }
}

2 个答案:

答案 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的库,大大简化了您要实现的目标。