所以我一直在Android平台上工作,我遇到了一个问题。我一直使用FireBase作为我选择的数据库来存储从应用程序上传的图像。当用户选择要上传的图像时,图片使用Base64编码到字符串上,这是保存在数据库中的内容。现在,我想通过将字符串解码为位图,在应用程序中的其他活动上填充ImageView,并将所有图片上传到数据库中。但是,我在使用从db中获取数据的方法时遇到问题,以便填充此ImageView:
public class ImageAdapter extends BaseAdapter {
public ImageView imageView;
public Bitmap[] imagesDecoded;
public int i = 0;
private Context mContext;
public String holdsImage = "";
//these are just methods required by the ImageAdapter
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
//more code to set up the imageView
if (convertView == null) {
// if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(250, 250));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
//setting up array for images extracted from database, this is where it gets messy
//This is the method used for the database to retrieve values from it
Firebase ref = new Firebase("https://myapp.firebaseio.com/posts");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
long flyerCount = snapshot.getChildrenCount();
int flyerCountInt = (int) flyerCount;
imagesDecoded = new Bitmap[flyerCountInt];
for (DataSnapshot postSnapshot: snapshot.getChildren()) {
Flyer post = postSnapshot.getValue(Flyer.class);
holdsImage = post.getTitle();
turnImageStringToImage(holdsImage);
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
System.out.println("The read failed: " + firebaseError.getMessage());
}
});
imageView.setImageBitmap(imagesDecoded[position]);
return imageView;
}
private void turnImageStringToImage(String s){
byte[] decodedString = Base64.decode(s, Base64.DEFAULT);
Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
imagesDecoded[i] = decodedByte;
i++;
}
所以我的问题是,onDataChange方法中for循环中发生的任何事情都不可用于它之外。例如,如果我在onDataChange方法之后已经分配了字符串post.getTitle()之后尝试使用了holdImage字符串,那么该字符串将返回到值为“”的状态,这就是它初始化为on的内容。所有这些方法之外的全球范围。通常情况下,如果我可以放置这条线,这是可以解决的:
imageView.setImageBitmap(imagesDecoded[position]);
在for循环内部填充ImageView,但是位置变量然后给我一个错误,说它需要被声明为final,这是不可能的,因为它被声明为getView方法的参数。我也尝试在for循环中包含turnImageStringToImage的内容,但这也不起作用。无论我做什么,该方法内部发生的任何事情都不会转移到写入的内容上,以便我可以在方法之外使用它。令人困惑的是,所有这些变量和数组都被声明为全局,所以我不明白为什么它们的值会恢复到onDataChange运行方法之后的状态。我还尝试创建一个对象并在循环中修改其中的一个值但是当我在方法之外访问该值时,它仍然不是它在那里分配的值。我能做些什么来基本保留在onDataChange方法中在for循环中写入的数组内容?