我在我的数据库中有一篇文章,其中包含图片,标题和价格。我将标题和价格添加到每个数组中,它们的顺序正确,因此价格与标题相符。但是当我加载图像时,我会像这样解码它:
private Bitmap decodeFile(byte[] b) {
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeByteArray(b, 0, b.length, o);
// The new size we want to scale to
final int REQUIRED_SIZE=200;
// Find the correct scale value. It should be the power of 2.
int scale = 1;
while(o.outWidth / scale / 2 >= REQUIRED_SIZE &&
o.outHeight / scale / 2 >= REQUIRED_SIZE) {
scale *= 2;
}
// Decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeByteArray(b, 0, b.length, o2);
}
解码完成后,我将它添加到图像ArrayList中,如下所示:
imageList.add(bmp);
然后图像的价格和标题可以是例如在价格和标题ArrayLists中的索引0,但图像可能比另一个图像解码慢,所以如何在索引0处添加图像?这是我加载和添加的总代码:
private void loadData(){
ParseQuery<ParseObject> query = ParseQuery.getQuery("Items");
query.setLimit(20);
query.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> itemList, ParseException e) {
if (e == null) {
Log.d("Parse", "Retrieved " + itemList.size() + " items");
itemsLoaded = itemList.size();
for (int i = 0; i < itemList.size(); i++){
pricesList.add(itemList.get(i).getInt("price"));
titlesList.add(itemList.get(i).getString("title"));
Log.d("Parse", "objectID = " + itemList.get(i).getObjectId());
}
} else {
Log.d("Parse", "Error: " + e.getMessage());
}
for (int j = 0; j < titles.size(); j++){
ParseQuery<ParseObject> query2 = ParseQuery.getQuery("Images");
query2.whereEqualTo("imageId", itemList.get(j).getObjectId());
query2.findInBackground(new FindCallback<ParseObject>() {
public void done(List<ParseObject> picList, ParseException e) {
if (picList.size() != 0){
ParseFile pFile = (ParseFile) picList.get(0).get("image");
pFile.getDataInBackground(new GetDataCallback() {
public void done(byte[] data, ParseException e) {
if (e == null) {
Log.d("Parse", "We've got data in data.");
Bitmap bmp = decodeFile(data);
imageList.add(bmp);
if (imageList.size() == titles.size())
updateGridView();
} else {
Log.d("test", "There was a problem downloading the data.");
}
}
});
}
Log.d("Parse", "Downloaded images = " + picList.size());
}
});
}
}
});
}
答案 0 :(得分:1)
正如我评论的那样:我会使用Map
,您可以在其中为每个值定义一个键。关键可能是唯一的产品编号。如果将此策略用于所有单独的属性,则不依赖于不同加载过程中的计时问题。
在处理内存使用方面的最佳性能时,其他答案中描述的技术非常有趣。延迟加载可能需要更长时间才能实际显示图像,但它会节省工作内存,因为您不会将所有图像都存储在内存中。
答案 1 :(得分:0)
您好您可以使用Lazy列表正确加载图像。参考http://androidtutorialbd.blogspot.in/2013/03/lazy-list-view.html
答案 2 :(得分:0)
我认为如果你有一个带有图像的Article
类(或者可能更好地引用图像,所以你只需要在需要时解码它们),标题和价格变量应该会更好。当您加载数据时,您创建了article
...这样您确定文章的图像,标题和价格都是正确的......
现在你依赖于3个列表的顺序,所以错误肯定会发生!