这是界面:
public interface BitmapCallBackInterface {
void onCallBack(Bitmap bitmap);
}
这是方法并调用它:
public void downloadImagesFromFireStorage(String imgName, final BitmapCallBackInterface bitmapCallBackInterface) {
StorageReference storageRef = FirebaseStorage.getInstance()
.getReferenceFromUrl("gs://fake-mc-app.appspot.com").child("imgs").child(imgName + ".png");
final long ONE_MEGABYTE = 1024 * 1024;
storageRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
bitmapCallBackInterface.onCallBack(bitmap);
}
});
}
称之为:
for (i = 0; i < nameList.size(); i++) {
String couponName = nameList.get(i);
storageHandler.downloadImagesFromFireStorage(imgName, new BitmapCallBackInterface() {
@Override
public void onCallBack(Bitmap bitmap) {
insertImg(couponName, bitmap); // store image into SQLite
}
});
}
getDataFromSQLite();
// and then display Bitmaps to the a list of ImageView
我想要做的是,下载几张图片,完成下载完成后,刷新列表视图
答案 0 :(得分:1)
首先,我希望您在列表视图中使用CursorAdapter,而不是将数据从sqlite,arraylist,ArrayAdapter等中提取。
其次,理想情况下,您不应将listview图像存储为数据库的一部分。您可以存储firebase链接,然后在适配器中 ,您将请求图像内容(使用图像加载库,如Glide,见下文)
在任何情况下,您需要做的是在插入图像后通知适配器dataSetChanged 每次调用onCallBack ,然后列表将在之后更新图像是在sqlite中。
如果要在通知适配器之前等待插入所有图像,可以检查插入的图像位置nameList.size()
您可能还想考虑使用OnSuccessListener<byte[]>
接口将字节存储为sqlite作为BLOB,而不一定是Bitmap对象。在这种情况下,您不需要额外的界面
但是,Android文档中用于图像加载的鼓励模式通常是使用Glide